我打電話用幾個SQL文件:如何正確使用setvar?
:r C:\Scripts\Script1.sql
:r C:\Scripts\Script2.sql
:r C:\Scripts\Script3.sql
我有這樣的想法來自這裏的:r
電話:TransactSQL to run another TransactSQL script。 Script1.sql
腳本也可能在其代碼中有其他的SQL腳本調用等。
但是現在我想爲每個腳本定義設置。例如:我定義了LastInsertedID
,並在Script1.sql
的呼叫之前將其設置爲值SCOPE_IDENTITY()
。這個腳本現在使用這個變量並且與它一起工作。
要做到這一點我用的sqlcmd腳本變量(http://msdn.microsoft.com/de-de/library/ms188714.aspx),並通過設置它們:
:setvar LastInsertedID SCOPE_IDENTITY()
然後我可以寫在Script1.sql
SELECT $(LastInsertedID
和它會給我正確的值。
後來我發現這是不正確的,因爲如果您在選擇$(LastInsertedID)
之前先處理其他INSERT
聲明,它會爲您提供新插入行的ID。這可能是這種情況,因爲:setvar
不保存當前的SCOPE_IDENTITY()
的值,而是對其進行引用,並在請求後再次調用它。
所以我嘗試了一些不同的東西,並聲明瞭一個變量,將其賦值爲當前值SCOPE_IDENTITY()
,然後用:setvar
保存。它看起來像這樣:
DECLARE @LastInsertedID int
SELECT @LastInsertedID = SCOPE_IDENTITY()
:setvar LastInsertedID @LastInsertedID
PRINT $(LastInsertedID)
這再次工作,並提供了正確的結果。但後來我把我的代碼分成了多個GO
部分,並意識到:setvar
再次提供不了所需的輸出。
DECLARE @LastInsertedID int
SELECT @LastInsertedID = SCOPE_IDENTITY()
:setvar LastInsertedID @LastInsertedID
GO
PRINT $(LastInsertedID)
現在給你一個錯誤消息說:Must declare the scalar variable @LastInsertedID
當你插入之前的例子中的:setvar
後GO
。
再次:setvar
不保存變量@LastInsertedID
的實際值,但此外還引用了變量本身,當然在該給定的上下文中不再存在。
我現在的問題是,我該如何恰當地使用:setvar
或者我如何以期望的輸出方式解決這個問題?
我感謝任何幫助或輸入!
我想設置一些值,然後使用這些值運行腳本。例如:將id設置爲1,運行腳本,該腳本爲ID爲1的條目插入一些附加數據。稍後重新使用它,並將id設置爲2.所以基本上是一個簡單的函數調用,但帶有腳本文件。 –
這樣做。你可以像':setvar ID 1'那樣做,然後在腳本的SQL部分執行'insert into dbo.tbl($(ID))'或者將它分配給一個SQL變量(例如@id)。對於所有意圖和目的,在運行時將$(ID)視爲由sqlcmd替換爲變量值的靜態文本。 –
啊...我以爲你想要幫助。成爲一個屁股不是一個很好的方法來實現這一目標。也就是說,SQL變量填充您嘗試使用sqlcmd變量填充的角色。爲什麼,特別是,你覺得你需要分配一個sqlcmd變量?你想用sqlcmd變量來完成什麼,你不能使用SQL變量? –