我正在尝试制作一些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
书籍。