2017-07-26 70 views
1

我在嘗試製作一些SQL腳本,它將輸出大型數據庫中的所有表名,以及每個字段和記錄的數量以及字段名稱的列表。這將使我們能夠將注意力集中在具有數據的表格上,並查找與不同表格匹配的字段名稱,這可能是適合連接的地方。爲sp_executesql聲明輸出參數

爲此,我試圖編寫動態SQL,可以遍歷所有表。但是我一直無法得到sp_executesql來產生我可以插入到我的表變量中的輸出。下面是我到目前爲止已經編寫的代碼:

USE MITAS_TEST; 
DECLARE @TablesAbstract TABLE(
    TableName VARCHAR(50), 
    NumberOfFields INT, 
    NumberOfRecords INT 
); 
DECLARE @NumberOfRowsCounted INTEGER; 
SET @NumberOfRowsCounted = 0; 
DECLARE @RecSql NVARCHAR(500); 
SET @RecSql = 'EXECUTE(''SELECT @NumberOfRows = COUNT(*) FROM ''[email protected])'; 
DECLARE @ParmDefinition NVARCHAR(100); 
SET @ParmDefinition = '@TableName NVARCHAR(100), @NumberOfRows INTEGER OUTPUT'; 
DECLARE @TableN NVARCHAR(100); 
SET @TableN = 'MITAS_TEST.dbo.AP500'; 
EXECUTE sp_executesql @RecSql, 
    @ParmDefinition, 
    @TableName = @TableN, 
    @NumberOfRows = @NumberOfRowsCounted OUTPUT; 

我收到以下錯誤:

Msg 137, Level 15, State 1, Line 1
Must declare the scalar variable "@NumberOfRows"

我還以爲它足以在@ParmDefinition場(基於源在此,申報@NumberOfRowshttps://technet.microsoft.com/en-us/library/ms188001(v=sql.90).aspx )。我究竟做錯了什麼?有沒有更好的辦法?

回答

0

內執行的模樣:

EXECUTE('SELECT @NumberOfRows = COUNT(*) FROM MITA_TEST.dbo.AP500') 

在這種情況下,@NumberOfRows不存在。您可以將其更改爲對sp_executesql的另一個調用,並將輸出參數@NumberOfRows傳遞給另一個級別。

假設這代表學習代碼,而不是生產。根據@TableN的來源,這可能會對SQL注入攻擊產生影響。在線圖書參見quotename