0
我正在嘗試編寫一個簡單的存儲過程,它包含三個參數「數據庫名稱一」,「數據庫名稱二」和「表名稱」。然後,sql將爲每個數據庫中定義的表執行一次行計數並存儲它。從名稱作爲變量傳遞的表中選擇
它的工作零碎我已經打了第一個問題,你不能這樣做
select * from @tablename
我知道你可以使用動態SQL與exec
命令,但因爲我無法回報,這是不理想值。
下面的示例看起來應該可以工作,但不能。
declare @tablename as nvarchar(500)
declare @sqlstring as nvarchar(500)
declare @parmdefinition as nvarchar(500)
declare @numrows as bigint
set @tablename = N'dummy_customer'
set @parmdefinition = N'@tablenameIN nvarchar(500), @numrowsOUT as bigint OUTPUT'
select @sqlstring = 'select @numrowsOUT = count(*) from @tablenameIN'
select @sqlstring
exec sp_executesql @sqlstring, @parmdefinition, @tablenameIN = @tablename, @numrowsOUT = @numrows OUTPUT
select @numrows
給出的錯誤信息是
Msg 1087, Level 16, State 1, Line 1
Must declare the table variable "@tablenameIN".
目前使用SQL Server 2008 SP2。
編輯: 我們這樣做是因爲我們正在進行遷移,並且客戶需要一個報告,顯示源數據庫和目標數據庫中每個表的行計數。由於有許多表能夠使用sp_MSForEachTable來調用存儲過程似乎是理想的。
編輯:
以供將來參考最終的解決方案是
declare @tablename as nvarchar(500)
declare @sqlstring as nvarchar(500)
declare @parmdefinition as nvarchar(500)
declare @numrows as bigint
set @tablename = N'dummy_customers'
set @parmdefinition = N'@tablename nvarchar(500), @numrowsOUT as bigint OUTPUT'
select @sqlstring = 'select @numrowsOUT = count(*) from ' + quotename(@tablename)
exec sp_executesql @sqlstring, @parmdefinition, @tablename = @tablename, @numrowsOUT = @numrows OUTPUT
select @numrows
完美的作品。謝謝。 – JamieDainton 2010-11-09 22:07:43