声明sp_executesql的输出参数



我正在尝试制作一些SQL脚本,该脚本将输出大型数据库中的所有表名称,以及每个表中的字段和记录数以及字段名称列表。这将使我们能够专注于包含数据的表,并查找从不同表中匹配的字段名称,这可能是连接的合适位置。

为此,我正在尝试编写可以循环浏览所有表的动态 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 ''+@TableName)';
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,级别 15,状态 1,第 1 行 必须
声明标量变量"@NumberOfRows">

我认为在@ParmDefinition字段中声明@NumberOfRows就足够了(基于此来源:https://technet.microsoft.com/en-us/library/ms188001(v=sql.90(.aspx(。我做错了什么?有没有更好的方法?

内部执行如下所示:

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

在这方面,@NumberOfRows不存在。您可以将其更改为对sp_executesql的另一个调用,将输出参数@NumberOfRows传递到另一个级别。

假设这代表学习代码,而不是生产。根据@TableN的来源,这可能是 SQL 注入攻击的可取之处。在线查看quotename书籍。

相关内容

  • 没有找到相关文章

最新更新