2017-06-13 31 views
-1

所以,在我的存儲過程我有在使用與在值的存儲過程()

Update Table 
Set Table.Value = 2 
Where Table.ID In (1,2,3) 

我調用存儲過程,我想在1,2,3通過。 這個列表中有數量未知的值,所以我不能只使用幾個變量。

我曾嘗試以下,但這不起作用

Declare @IDS Varchar = '1,2,3'; 

Update Table 
Set Table.Value = 2 
Where Table.ID In (@IDS) 

是否有在T-SQL數組類型(或類似),讓我在傳遞多個值用於此目的?

謝謝

+1

使用動態查詢。 –

+0

我想添加到[SQL Server 2016具有'STRING_SPLIT'](https://docs.microsoft.com/zh-cn/sql/t-sql/functions/string-split-transact-sql) –

回答

0

您可以將任何表變量傳遞給存儲過程或xml變量。我更喜歡xml,因爲它更有彈性。

例子:

GO 
CREATE PROCEDURE #tmpProcedure 
    @xml xml 
AS 

    UPDATE tbl SET 
     Value = 2 
    FROM table tbl 
    WHERE 1 = 1 
     AND EXISTS (SELECT 1 
        FROM @xml.nodes('IdsToUpdate/Id') t(x) 
        WHERE 1 = 1 
         AND t.x.value('.','int') = tbl.Id 
        ) 


GO 
DECLARE @xml xml = 
     ' 
      <IdsToUpdate> 
       <Id>1</Id> 
       <Id>14</Id> 
       <Id>15</Id> 
       <Id>2</Id> 
      </IdsToUpdate> 
     ' 
GO 

EXEC#tmpProcedure @xml 
+0

該代碼更麻煩*,並可能導致全面掃描。對於TVP,您只需要使用參數加入目標表。如果提取ID並將它們放在表變量中,可以提高性能。但是,爲什麼要這樣做,何時可以使用表參數呢? –

+0

表參數需要從您創建數據類型 –

+0

另一個簡單的方法是在調用存儲過程之前創建tmp表。這允許你使用tmp表,它是存儲過程中的值。 –