20

SQLCMD.exe を実行し、スクリプト変数にコマンド ライン引数を指定すると、コマンド ラインで指定された値が SQL スクリプト ファイルで定義された値を上書きすることを期待します。

例えば

次の SQL スクリプトがあるとします。

:setvar XXX "SQL script"
print '$(XXX)'

そしてコマンドライン:

sqlcmd.exe -S <Server> -d <Database> -E -b -i <Script> -v XXX="Batch script"

出力は次のようになると思います。

バッチスクリプト

ただし、出力は次のとおりです。

SQL スクリプト

これは意図的なものですか、それとも:setvarSQL スクリプト内のステートメントを削除する必要がありますか?

スクリプトでステートメントを提供した:setvarので、SQL Management Studio で SQLCMD モードを使用してスクリプトを編集/テストできますが、テスト環境と運用環境ではコマンドラインからスクリプトを実行できます。

4

5 に答える 5

18

これは仕様によるもののようです。誰かがすでにConnectで変更要求を出しました: http ://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID = 382007

私が見ることができる問題を回避する唯一の方法は、:setvarリリース時にコマンドをコメントアウトする(または削除する)ことです。

于 2009-05-07T11:01:51.610 に答える
7

私もこれに苦労していましたが、msdeploy.exe も変数を使用して SQL スクリプトを実行できることに気付いたのを覚えています。しかし、奇妙な理由により、msdeploy.exe はコマンド ラインから変数を渡すことができます。コマンド ラインからの変数値は、スクリプト自体で定義された値よりも優先されます。

例: 3 つのパラメーターが定義された SQL スクリプト (NavDbSecurity.sql) があります。

:setvar loginName "testLoginName"
:setvar databaseName "testDatabaseName"
:setvar NavCompanyName "blablabla"

次の msdeploy スクリプトを実行すると、コマンドラインを介して渡すパラメーター値が、スクリプト ファイルで定義された値よりも優先されます (パスワードのない sa ユーザーは気にしないでください ;))。

msdeploy.exe -verb:sync -source:dbfullsql="c:\NavDbSecurity.sql" -dest:dbfullsql="data source=.\sqlexpress;initial catalog=data base;User Id=sa;Password=;",transacted=False -setParam:kind=SqlCommandVariable,scope="NavDbSecurity.sql",match=databaseName,value="[data base]" -setParam:kind=SqlCommandVariable,scope="NavDbSecurity.sql",match=loginName,value="domain\user" -setParam:kind=SqlCommandVariable,scope="NavDbSecurity.sql",match=NavCompanyName,value="testCompany"
于 2011-02-25T13:10:27.740 に答える
7

sqlproj ファイルを編集して、次のプロパティを追加してみてください

<CommentOutSetVarDeclarations>true</CommentOutSetVarDeclarations>

生成された sql ファイルでは setvars がコメント アウトされているため、コマンド ラインを使用して実際の値を設定できます。

于 2014-10-02T11:51:57.327 に答える
3

Consider using the :r filename command for your setvars.

Being a separate file, you can use tha same filenameacross your deployment regions each containing their own region specific contents.

:r path\sqlConfig.sql
于 2012-07-18T17:29:46.070 に答える
1

意図的だと思います。現在、.sql スクリプトの setvar ステートメントが最も優先されます。

于 2009-08-29T00:49:02.773 に答える