2017-07-26 38 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