2016-02-19 52 views
0

我想在SQL/PDW中的while循環內執行動態查詢。此查詢將給我最大/最小日期以及Fact表中日期的不同計數。我需要爲我的數據庫中的所有模式執行此操作(所有模式具有相同的表結構)。在SQL循環中執行動態查詢

DECLARE @intCNT INT 
SET @intCNT = 1 
DECLARE @strSQL1 VARCHAR(1000) 
DECLARE @strSQL2 VARCHAR(1000) 
DECLARE @strSQL3 VARCHAR(100) 


SET @strSQL1 = 'SELECT MAX(FT_DT) AS MAX_DT, 
        MIN(FT_DT) AS MIN_DT, 
        COUNT(DISTINCT FT_DT) AS DT_CNT 
       FROM ' 

SET @strSQL2 = CONCAT('(SELECT TABLE_SCHEMA 
         FROM 
          (SELECT ROW_NUMBER() OVER(ORDER BY TABLE_SCHEMA) AS ROW_NUM, 
           TABLE_SCHEMA 
          FROM INFORMATION_SCHEMA.TABLES 
          WHERE TABLE_NAME = ''FT_TBL'' 
           AND TABLE_SCHEMA LIKE ''F%'')T 
         WHERE ROW_NUM = ',@intCNT,')') 

SET @strSQL3 = '.FT_TBL' 

EXEC (@strSQL1 + @strSQL2 + @strSQL3) 

當我執行,我得到以下錯誤:

Msg 102, Level 15, State 1, Line 11 
Incorrect syntax near '.'. 

是否是與語法,我想執行的查詢下面給出?我想讓我的PDW實例工作。我在SQL Server中嘗試過,但得到了同樣的錯誤

+0

不知道你是用第三部分做什麼,你需要執行strSQL2,然後將其作爲表名添加到strSQL1,這會使查詢成爲select * from「從子查詢結果生成的名稱」。 –

+0

使用動態sql的一個重要工具是PRINT語句。打印你正在嘗試執行的sql字符串,通常語法錯誤是顯而易見的。 –

+0

我需要的是「select ---- from .FT_TBL」,適用於所有模式。我需要在執行結束時將完整的結果集保存在表中。 –

回答

0

你實際上是試圖excecute是:從@ strSQL3

SELECT MAX(FT_DT) AS MAX_DT, 
        MIN(FT_DT) AS MIN_DT, 
        COUNT(DISTINCT FT_DT) AS DT_CNT 
       FROM 
(SELECT TABLE_SCHEMA 
         FROM 
          (SELECT ROW_NUMBER() OVER(ORDER BY TABLE_SCHEMA) AS ROW_NUM, 
           TABLE_SCHEMA 
          FROM INFORMATION_SCHEMA.TABLES 
          WHERE TABLE_NAME = 'FT_TBL' 
           AND TABLE_SCHEMA LIKE 'F%')T 
         WHERE ROW_NUM = 1) 
.FT_TBL 

的.FT_TBL摧毀你的查詢。也許這應該是

set @strSQL3 = ' FT_TBL' 
+0

當我執行上述時,我得到一個解析錯誤。 –

+0

什麼解析錯誤?,如果它是''我解決了它,但我真的不能測試它 –

+0

謝謝你。我應該在這裏使用動態sql嗎?當我執行你的select語句(沒有任何變量)時,我得到: 消息103010,級別16,狀態1,行1 解析行錯誤:14,列:1:'。'附近語法不正確。 –

0

您的代碼可以用光標來代替用下面的查詢,使您能夠選擇每個模式

DECLARE @Schema_Name VarChar 

DECLARE MY_CURSOR CURSOR 
    LOCAL STATIC READ_ONLY FORWARD_ONLY 
FOR 
SELECT DISTINCT TABLE_SCHEMA 
FROM TABLE_SCHEMA 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME = 'FT_TBL' 
AND TABLE_SCHEMA LIKE 'F%' 

OPEN MY_CURSOR 
FETCH NEXT FROM MY_CURSOR INTO @Schema_Name 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    --Do something with Id here 
    execute CONCAT(CONCAT('SELECT MAX(FT_DT) AS MAX_DT, 
       MIN(FT_DT) AS MIN_DT, 
       COUNT(DISTINCT FT_DT) AS DT_CNT 
      FROM ',@Schema_Name),'FT_TBL') 
    FETCH NEXT FROM MY_CURSOR INTO @Schema_Name 
END 
CLOSE MY_CURSOR 
DEALLOCATE MY_CURSOR 
+0

非常感謝您的回覆。我在並行數據倉庫中並且不支持遊標:( –

+0

雖然我希望它對您有用,即使只是作爲了解要查找的內容的基礎。 – jclozano

+0

我發現並行您必須使用表作爲隊列而不是光標http://rusanu.com/2010/03/26/using-tables-as-queues/ – jclozano