2010-11-09 61 views
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 

回答

6

你不得不使用動態SQL,並連接所有的表名到SQL字符串,然後通過sp_executsql執行:

select @sqlstring = 'select @numrowsOUT = count(*) from ' + QUOTENAME(@tablename) 
EXECUTE sp_executesql .... 
+0

完美的作品。謝謝。 – JamieDainton 2010-11-09 22:07:43

相關問題