TL; DR; SQL Serverインスタンスが、動作していない動的ポートを使用しています。SQL Serverで静的ポート#1433を使用するように強制します。
完全な詳細:まず、この問題は、デフォルトと名前付きインスタンスの組み合わせ、または名前付きインスタンスのみ(私の場合)の場合に発生する可能性が高くなります。
重要な概念:コンピューターにインストールされているMicrosoft SQL Serverの各インスタンスは、異なるポートを使用して着信接続要求をリッスンします。SQL Serverのデフォルトインスタンスはポート#1433を使用します。名前付きインスタンスをインストールすると、名前付きSQL Serverインスタンスに対応するWindowsサービスの起動時に決定される動的ポートの使用が開始されます。
VMにある名前付きの唯一のSQL Serverインスタンスへの接続に失敗しました(エラーコード40)。以下の可能な解決策を試すことができます:
解決策1:SQL Serverインスタンスに接続しようとするクライアントコードは、SQL Serverブラウザーサービスの助けを借りて、名前付きインスタンスが着信接続をリッスンしているポート番号を把握します。コンピューターでSQLブラウザーサービスが実行されていることを確認します。
解決策2:下のスナップショットに示すように、名前付きSQL ServerインスタンスがSQL Server構成マネージャーから使用しているポート番号(黄色)を確認します。
接続文字列で明示的にそのポート番号を使用するか、sqlcmd
以下に示します。
sqlcmd -s mymachinename,11380 -i deleteDB.sql -o SQLDelete.txt
解決策3:デフォルトのインスタンスで使用されるポート#1433を使用するように名前付きインスタンスを強制します。これは、デフォルトのSQL Serverインスタンスがポート#1433をすでに使用しているため、コンピューターにデフォルトのSQL Serverインスタンスがない場合にのみ機能することに注意してください。同じポート番号を2つの異なるWindowsサービスで使用することはできません。
TCP Dynamic ports
フィールドを空白に、TCP Port
フィールドを1433にマークします。
以下に示すように、接続文字列のポート番号を変更します。
sqlcmd -s mymachinename\instanceName -i deleteDB.sql -o SQLDelete.txt
または
sqlcmd -s mymachinename,1433 -i deleteDB.sql -o SQLDelete.txt
注:TCP / IP設定を変更するたびに、対応するWindowsサービスを再起動する必要があります。
興味深いことに、動的ポート設定に戻って同じエラーを再現したときにエラーを解決した後、それは起こりませんでした。なぜだかわかりません。
SQL Serverの動的ポートの詳細については、以下の興味深いスレッドをお読みください。
複数のインスタンスでSQL Serverポートを構成する方法
動的ポートはいつ「動的」ですか?
いつTCP動的ポートを使用し、いつTCPポートを使用しますか?
このブログから私の問題の解決につながりました。