2016-02-04 40 views
0

試圖創建一個查詢來聲明存儲逗號分隔的int列表的變量,然後在之後的WHERE語句中重新使用該列表。參數必須以IN(int,int,int)等格式傳遞,並且將始終根據@TG的值進行更改。以下是我到目前爲止:在SQL中創建可用的逗號分隔的INT列表變量

DECLARE @TG int = 14168 

DECLARE @TG_ITEMS varchar = (SELECT 
          STUFF((SELECT DISTINCT 
           ',' + CONVERT(varchar(10), i.item_key, 120) 
            FROM store__tracking_group sitg 
            JOIN store_tracking_group_detail sit 
            JOIN item i 
            WHERE sitg.number IN (@TG) 
            FOR XML PATH ('')), 1, 1, '')) 




--- MAIN QUERY HERE 

SELECT '' 
FROM '' 
WHERE 'xx' IN (@TG_ITEMS) 
+0

假設SQL服務器,通過語法猜測 - 沒有動態SQL,或者以某種方式將該字符串拆分爲表的函數不起作用。爲什麼不能創建一個包含ID列表的臨時表/表變量,然後加入到其他查詢中?如果您使用的是2008+版本,則執行此操作的最佳方式是表格值參數。 – Bridge

+1

只需用你想要的ID創建一個臨時表。然後加入桌子。無需轉換爲字符串。 – Carra

+0

'IN'運算符期望以逗號分隔的值列表,而您試圖給它一個包含逗號分隔數據的值。這是'IN(1,2,3,4)'和'IN('1,2,3,4')'之間的區別 - 第一個將起作用。 –

回答

2

錯誤的方法。 SQL數據庫有一個偉大的數據結構來存儲列表。它被稱爲,而不是一個字符串。

一種方式做你想要在精神上什麼是表變量:

DECLARE @TG int = 14168; 

DECLARE @TG_ITEMS TABLE (item_key int); 

INSERT INTO @TG_ITEMS(item_key) 
    SELECT DISTINCT i.item_key 
    FROM store__tracking_group sitg JOIN 
     store_tracking_group_detail sit 
     ON ??? JOIN 
     item i 
     ON ??? 
    WHERE sitg.number = @TG; 

SELECT '' 
FROM '' 
WHERE 'xx' IN (SELECT item_key FROM @TG_ITEMS); 

這樣做有很多好處,比如可讀性和性能。

+0

這工作。謝謝澄清 –

+1

@mikeG,你爲什麼不標記爲答案? :) – FLICKER