2015-04-08 58 views
1

我有幾個查詢要在客戶表上運行。這些查詢中的每一個都可以識別客戶表中的可能數據質量問題。例如,一個查詢是查找客戶的年齡是否爲< 18,這不能/不應該是這種情況。整個SQL查詢作爲存儲過程中的變量

我有一個遊標,將這些查詢中的每一個逐個提取到一個變量中。

我很努力地運行這些查詢,並彙總結果。

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中調用此過程,所以我想在Excel中的一個表中有所有失敗計數。

+0

這是你在找什麼? http://www.sqlusa.com/bestpractices/dynamicsql/ –

+0

對桌子施加限制是不是更好,因此這些條件不能放入表格中? – HLGEM

回答

1

假設每個查詢有結果有兩列的表:標題,失敗。您的查詢只有一列(失敗),但您不知道該輸出的失敗情況。更改爲讓他們返回標題列。你做什麼:

  1. 創建一個表變量或臨時表與同列
  2. 從執行SQL查詢到表變量或臨時表
  3. 循環後插入輸出,選擇內容作爲存儲過程的結果,表變量或臨時表的結果。

例子:

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; 
0

光標內的以下代碼將完成您的工作。但不要忘了申報@rulequery變量

IF LEN(LTRIM(RTRIM(@rulequery)))>0 
EXEC(@rulequery)