整个 SQL 查询作为存储过程中的变量
Entire SQL query as variable in stored procedure
我有几个问题要 运行 询问客户 table。这些查询中的每一个都确定了客户 table 中可能存在的数据质量问题。例如,一个查询是查找客户的年龄是否小于 18 岁,但不能/不应该是这种情况。
我有一个游标,可以将这些查询中的每一个查询一个一个地提取到一个变量中。
我正在努力 运行 这些查询中的每一个并汇总结果。
DECLARE c1 CURSOR FOR SELECT [ruleQuery] FROM [dbo].[SQL_DataQuality_Rules]
OPEN rules_cursor
FETCH NEXT FROM rules_cursor INTO @rulequery
WHILE @@FETCH_STATUS = 0
BEGIN
--Help needed here to execute @rulequery which would be something like
--SELECT sum(case when age < 18 then 1 else 0 end) as 'Fail' FROM...
FETCH NEXT FROM rules_cursor INTO @rulequery
END
CLOSE c1
DEALLOCATE c1
因为我将从 excel 调用此过程,所以我希望将所有失败计数集中在一个 table 中 excel。
光标内的以下代码将完成您的工作。但不要忘记声明@rulequery变量
IF LEN(LTRIM(RTRIM(@rulequery)))>0
EXEC(@rulequery)
假设您的每个查询的结果是 table,其中有两列:标题、失败。您的查询只有一列(失败),但您不知道该输出的失败原因。也更改为让它们 return 成为标题栏。你做什么:
- 使用相同的列
创建一个 table 变量或临时 table
- 将执行 SQL 查询的输出插入 table 变量或临时 table
- 循环后,select table 变量或临时 table 的内容作为存储过程的结果。
示例:
DECLARE @res TABLE(title VARCHAR(256), fail INT);
DECLARE c1 CURSOR FOR SELECT [ruleQuery] FROM [dbo].[SQL_DataQuality_Rules];
OPEN rules_cursor;
DECLARE @rulequery VARCHAR(MAX);
FETCH NEXT FROM rules_cursor INTO @rulequery;
WHILE @@FETCH_STATUS = 0
BEGIN
--Query like: SELECT 'Age check' AS title, sum(case when age < 18 then 1 else 0 end) as 'Fail' FROM...
INSERT INTO @res(title,fail) EXEC (@rulequery);
FETCH NEXT FROM rules_cursor INTO @rulequery;
END
CLOSE c1;
DEALLOCATE c1;
SELECT*FROM @res;
我有几个问题要 运行 询问客户 table。这些查询中的每一个都确定了客户 table 中可能存在的数据质量问题。例如,一个查询是查找客户的年龄是否小于 18 岁,但不能/不应该是这种情况。
我有一个游标,可以将这些查询中的每一个查询一个一个地提取到一个变量中。
我正在努力 运行 这些查询中的每一个并汇总结果。
DECLARE c1 CURSOR FOR SELECT [ruleQuery] FROM [dbo].[SQL_DataQuality_Rules]
OPEN rules_cursor
FETCH NEXT FROM rules_cursor INTO @rulequery
WHILE @@FETCH_STATUS = 0
BEGIN
--Help needed here to execute @rulequery which would be something like
--SELECT sum(case when age < 18 then 1 else 0 end) as 'Fail' FROM...
FETCH NEXT FROM rules_cursor INTO @rulequery
END
CLOSE c1
DEALLOCATE c1
因为我将从 excel 调用此过程,所以我希望将所有失败计数集中在一个 table 中 excel。
光标内的以下代码将完成您的工作。但不要忘记声明@rulequery变量
IF LEN(LTRIM(RTRIM(@rulequery)))>0
EXEC(@rulequery)
假设您的每个查询的结果是 table,其中有两列:标题、失败。您的查询只有一列(失败),但您不知道该输出的失败原因。也更改为让它们 return 成为标题栏。你做什么:
- 使用相同的列 创建一个 table 变量或临时 table
- 将执行 SQL 查询的输出插入 table 变量或临时 table
- 循环后,select table 变量或临时 table 的内容作为存储过程的结果。
示例:
DECLARE @res TABLE(title VARCHAR(256), fail INT);
DECLARE c1 CURSOR FOR SELECT [ruleQuery] FROM [dbo].[SQL_DataQuality_Rules];
OPEN rules_cursor;
DECLARE @rulequery VARCHAR(MAX);
FETCH NEXT FROM rules_cursor INTO @rulequery;
WHILE @@FETCH_STATUS = 0
BEGIN
--Query like: SELECT 'Age check' AS title, sum(case when age < 18 then 1 else 0 end) as 'Fail' FROM...
INSERT INTO @res(title,fail) EXEC (@rulequery);
FETCH NEXT FROM rules_cursor INTO @rulequery;
END
CLOSE c1;
DEALLOCATE c1;
SELECT*FROM @res;