2009-05-07 135 views
16

運行SQLCMD.exe併爲腳本變量提供命令行參數時,我期望命令行上提供的值將覆蓋SQL腳本文件中定義的值。SQLCMD,命令行變量和腳本:setvar

例如

考慮下面的SQL腳本:

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

和命令行:

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

我期望的輸出是:

批處理腳本

但是輸出是:

SQL腳本

就是這種意圖,或者必須在SQL腳本的:setvar聲明被刪除?

我提供的:setvar報表腳本,這樣我就可以編輯/測試在SQL Management Studio中與SQLCMD模式下運行腳本,但在我的測試和生產環境運行在命令行的腳本。

回答

17

這似乎是設計;有人已經提出了在連接更改請求: http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=382007

解決這個問題的唯一途徑,我可以看到將註釋掉(或者刪除):setvar命令上發佈。

+5

這很爛!謝謝 – VirtualStaticVoid 2009-05-07 11:19:05

+4

真的很糟糕!我注意到,Microsoft Connect上的建議於2008年打開,並且仍處於活動狀態。呃,無論如何我都投了贊成票,雖然我的希望不是很高。 – 2011-02-09 15:57:55

+0

http://www.codeproject.com/Articles/1019661/Powershell-Scripts-to-Replace-setvar-Variable-in-S – Kody 2016-03-14 18:25:57

1

我認爲這是故意的。目前,.sql腳本中的setvar語句的優先級最高。

7

我還在爲此苦苦掙扎,但我記得當時注意到msdeploy.exe也能夠用變量執行sql腳本。但是,出於某種奇怪的原因,msdeploy.exe能夠將來自命令行的變量與命令行中的變量值進行比較,優先於腳本本身中定義的值。

一個例子: 我有一個SQL腳本(NavDbSecurity.sql),其具有定義了三個參數:

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

當我執行以下msdeploy腳本中,參數值I通過命令行的優先級高於在腳本文件中定義的值(不介意沒有密碼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" 
3

考慮使用:r filename命令你setvars。

作爲一個單獨的文件,您可以在部署區域中使用相同的文件名,每個區域都包含它們自己的區域特定內容。

:r path\sqlConfig.sql 
4

嘗試編輯您的sqlproj文件,並添加以下屬性

<CommentOutSetVarDeclarations>true</CommentOutSetVarDeclarations> 

生成的SQL文件將具有setvars註釋掉,然後你可以使用命令行設置的實際值。

+0

這真的很有幫助,在我的CI構建中我添加了'/ p:CommentOutSetVarDeclarations =真正的「msbuild命令,並從那裏優先問題是沒有問題了。 – 2018-01-16 12:09:47