這不是動態SQL,但依賴於類似延遲名稱解析。
EXECUTE,看到@module_name_var
參數
DECLARE @sql varchar(300)
SELECT
[name] + '..usp_ComputeDailySales' AS Cmd
INTO #List
FROM
sys.databases d WHERE d.[name] LIKE 'branch%'
OR --Thanks Mitch
d.[name] = 'Headquarters'
WHILE EXISTS (SELECT * FROM #List)
BEGIN
SELECT TOP 1 @SQL = Cmd FROM #List
EXEC @SQL
DELETE #List WHERE Cmd = @SQL
END
編輯,KM的評論後
是的,是有區別的,但我會澄清:
EXEC(@SQL)指@SQL可能'SELECT * FROM foo
'或'DELETE User WHERE 1=1'
;。)
EXEC @SQL意味着@SQL是一個對象名稱。所以,我應該用@Obj
所以,你可以這樣做:
DECLARE @Obj varchar(200)
SELECT @Obj = 'dbo.uspCustomHook'
IF OBJECT_ID(@Obj) IS NOT NULL
EXEC @Obj @p1 = 1, @p2 = 'bob', ...
它避免了延遲名稱解析錯誤。在編譯batch/proc時,如果dbo.uspCustomHook不存在,則不會出現錯誤。
自從SQL 2000以來,我還沒有使用這種技術,而且我不知道SQL 2005(語句級別的重新編譯)是否足夠聰明,如果應該運行@Obj,因爲它不存在,所以它不要嘗試編譯EXEC語句...
它對跨數據庫,相同的實例查詢也很有用。您可以配置prd-prod,dev-dev等,而不依賴於鏈接服務器或硬編碼數據庫名稱。
來源
2009-07-30 11:36:14
gbn
..OR d。[name] ='總部'... – 2009-07-30 11:38:48
+ 1。打我吧! ;) – 2009-07-30 11:39:21
上週,我實際上正在研究幾乎完全一樣的東西。我使用了動態sql:_EXEC(@SQL)_,使用_EXEC @SQL_有什麼優勢或不同? – 2009-07-30 13:11:37