整个 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 成为标题栏。你做什么:

  1. 使用相同的列
  2. 创建一个 table 变量或临时 table
  3. 将执行 SQL 查询的输出插入 table 变量或临时 table
  4. 循环后,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;