2016-07-07 106 views
0

我想將此查詢的結果合併到一個列表中的所有數據。 '聯盟'沒有幫助...合併SQL查詢的結果

有什麼想法嗎?

DECLARE @cnt INT = 0 
DECLARE @SQLQuery AS NVARCHAR(500) 
DECLARE @items AS VARCHAR(500) 
DECLARE @stline AS VARCHAR(500) 



while @cnt < 101 

begin 

set @items = 'LG_0' + convert(nvarchar(3),@cnt) + '_ITEMS' 
set @stline = 'LG_0' + convert(nvarchar(3),@cnt) + '_01_STLINE' 

if (OBJECT_ID (@items) is not null and OBJECT_ID(@stline) is not null) 

set @SQLQuery = 'SELECT 
    ITM1.CODE, itm1.NAME, max (stl.date_) [latest date] , price as [latest price], '+ convert(nvarchar(3),@cnt) + ' as [proje kodu] 

FROM ' + @items + ' ITM1 INNER JOIN ' + @stline + ' STL 
    ON ITM1.LOGICALREF = STL.STOCKREF 
WHERE PRICE > 0 
    AND TRCODE = 1 
    AND CANCELLED = 0 
    AND INVOICEREF > 0 


    group by code, name, stl.DATE_ , price 

    ' 

    exec (@SQLQuery) 



    set @cnt = @cnt +1 


end 

的結果是這樣的:

,但我希望他們所有聯盟-ED ......(對不起,大多是代碼的問題,我要在這裏添加更多的打字)

+0

蜜獾回答下面你的問題。我建議的另一種方法是使用臨時表並將結果插入它。 – DVT

回答

0
DECLARE @cnt INT = 0 
DECLARE @SQLQuery AS NVARCHAR(max) 
DECLARE @items AS VARCHAR(500) 
DECLARE @stline AS VARCHAR(500) 

set @SQLQuery ='' 

while @cnt < 101 

begin 

set @items = 'LG_0' + convert(nvarchar(3),@cnt) + '_ITEMS' 
set @stline = 'LG_0' + convert(nvarchar(3),@cnt) + '_01_STLINE' 

if (OBJECT_ID (@items) is not null and OBJECT_ID(@stline) is not null) 

set @SQLQuery = @SQLQuery + 'SELECT 
    ITM1.CODE, itm1.NAME, max (stl.date_) [latest date] , price as [latest price], '+ convert(nvarchar(3),@cnt) + ' as [proje kodu] 

    FROM ' + @items + ' ITM1 INNER JOIN ' + @stline + ' STL 
     ON ITM1.LOGICALREF = STL.STOCKREF 
    WHERE PRICE > 0 
     AND TRCODE = 1 
     AND CANCELLED = 0 
     AND INVOICEREF > 0 
    GROUP BY code, name, stl.DATE_ , price 

    UNION ALL 

    '  
    set @cnt = @cnt +1 
end 

-- SUBSTRING to remove last UNION ALL 
--PRINT len(@SQLQuery) 

set @SQLQuery = left (@SQLQuery , len(@SQLQuery)-18) 


--PRINT len(@SQLQuery) 

-- print @SQLQuery 

-- For debugging purposes 
-- PRINT @SQLQuery 
exec (@SQLQuery) 
+0

@honeybadger非常感謝!我意識到最後一部分應該剪切18個字符,而不是10個...... –

1

我不知道爲什麼UNION沒有爲你工作,但下面應該工作:

DECLARE @cnt INT = 0 
    DECLARE @SQLQuery AS NVARCHAR(MAX) = '' 
    DECLARE @items AS VARCHAR(500) 
    DECLARE @stline AS VARCHAR(500) 

    while @cnt < 101 

    begin 

    set @items = 'LG_0' + convert(nvarchar(3),@cnt) + '_ITEMS' 
    set @stline = 'LG_0' + convert(nvarchar(3),@cnt) + '_01_STLINE' 

    if (OBJECT_ID (@items) is not null and OBJECT_ID(@stline) is not null) 

    set @SQLQuery = @SQLQuery + 'SELECT 
     ITM1.CODE, itm1.NAME, max (stl.date_) [latest date] , price as [latest price], '+ convert(nvarchar(3),@cnt) + ' as [proje kodu] 

     FROM ' + @items + ' ITM1 INNER JOIN ' + @stline + ' STL 
      ON ITM1.LOGICALREF = STL.STOCKREF 
     WHERE PRICE > 0 
      AND TRCODE = 1 
      AND CANCELLED = 0 
      AND INVOICEREF > 0 
     GROUP BY code, name, stl.DATE_ , price 

     UNION ALL 
     '  
     set @cnt = @cnt +1 

    end 

    -- SUBSTRING to remove last UNION ALL 
    SELECT @SQLQuery = SUBSTRING(@SQLQuery, 1, LEN(@SQLQuery) - 18) 

    -- For debugging purposes 
    -- PRINT @SQLQuery 
    exec (@SQLQuery) 

我無法測試它,但你可以發表評論的exec,並取消對PRINT看到正在發生什麼樣的查詢。它使調試動態SQL變得容易很多。

這段代碼背後的思想:第一UNION ALL查詢正在建設,根據你的條件。最後刪除最後的UNION ALL,然後可以執行代碼。

+0

感謝您的時間... Msg 102,Level 15,State 1,Line 14 'ALL'附近的語法不正確。 Msg 102,Level 15,State 1,Line 14 'ALL'附近語法不正確。 Msg 102,Level 15,State 1,Line 14 'ALL'附近語法不正確。 Msg 102,Level 15,State 1,Line 14 'ALL'附近語法不正確。 Msg 102,Level 15,State 1,Line 14 'ALL'附近語法不正確。 Msg 102,Level 15,State 1,Line 14 'ALL'附近語法不正確。 Msg 102,Level 15,State 1,Line 14 'ALL'附近語法不正確。 –

+0

聽起來像SQL在循環中得到執行,你是否將'exec'放置在循環之外? – HoneyBadger

+0

當我刪除 「ALL」 消息102,級別15,狀態1,行14 附近的 '聯盟' 有語法錯誤。 Msg 102,Level 15,State 1,Line 14 「聯盟」附近的語法錯誤。 Msg 102,Level 15,State 1,Line 14 「聯盟」附近的語法錯誤。 –