2008-09-22 23 views
20

例如。我可以寫這樣的代碼:是否可以將ID集合作爲ADO.NET SQL參數發送?例如:

public void InactiveCustomers(IEnumerable<Guid> customerIDs) 
{ 
    //... 
    myAdoCommand.CommandText = 
     "UPDATE Customer SET Active = 0 WHERE CustomerID in (@CustomerIDs)"; 
    myAdoCommand.Parameters["@CustomerIDs"].Value = customerIDs; 
    //... 
} 

我所知道的唯一的辦法就是加入我的IEnumerable,然後使用字符串連接來構建我的SQL字符串。

回答

17

通常,這樣做的方式是傳遞逗號分隔的值列表,並在您的存儲過程中解析列表並將其插入臨時表中,然後您可以將它用於連接。從Sql Server 2005,這是處理需要保存數組的參數的標準做法。

這裏有不同的方法來處理這個問題的好文章:

Passing a list/array to an SQL Server stored procedure

SQL Server 2008中,我們終於到達表變量傳遞到程序,首先定義表作爲一個自定義類型。

有這個(多2008個功能),在這篇文章中一個很好的說明:

Introduction to New T-SQL Programmability Features in SQL Server 2008

+2

http://www.sommarskog.se/arrays-in-sql-2005.html和http://www.sommarskog.se/arrays-in-sql-2000.html是關於此主題的參考資料。他們也比Vyas的更詳細地討論了優點和缺點。 – 2009-08-01 01:26:28

-3

沒有。參數類似於服從first normal form的SQL值,基本上只能有一個...

正如您可能知道的那樣,生成SQL字符串是有風險的業務:您將自己打開爲SQL injection attack。只要你處理的是真正的GUID,你應該沒問題,但否則你需要確保清理你的輸入。

-3

您無法將列表作爲單個SQl參數傳遞。你可以string.Join(',')GUID,比如「0000-0000-0000-0000,1111-1111-1111-1111」,但是這對數據庫開銷和次優確實很高。您必須將整個字符串作爲單個連接的動態語句傳遞,不能將其添加爲參數。

問題:

你從哪裏得到您的ID代表非活動客戶的列表?

我的建議是以不同的方式解決問題。將所有的邏輯到數據庫中,這樣的:

Create procedure usp_DeactivateCustomers 
    @inactive varchar(50) /*or whatever values are required to identify inactive customers*/ 
    AS  
    UPDATE Customer SET c.Active = 0 
    FROM Customer c JOIN tableB b ON c.CustomerID = b.CustomerID 
    WHERE b.someField = @inactive 

並把它作爲一個存儲過程:

public void InactiveCustomers(string inactive) 
{ 
    //... 
    myAdoCommand.CommandText = 
     "usp_DeactivateCustomers"; 
    myAdoCommand.Parameters["@inactive"].Value = inactive; 
    //... 
} 

如果GUID在一個數據庫中的表,爲什麼我需要到:找到他們;把它們放在一個通用的列表中;將列表展開爲一個CSV/XML/Table變量,只是將它們呈現回DB。他們已經在那裏!我錯過了什麼嗎?

+0

因爲答案中的第一個陳述而降低了效率,這通常並不正確。儘管......在某些情況下,我可能確實有可能在數據庫中做所有事情,但我同意這些建議,但是如何轉移列表的問題根本不會出現。 – stakx 2015-06-29 07:34:23

5

您可以與SQL 2008。它沒有很長時間,但它是可用的。

2

正如提到in a comment,厄蘭Sommarskog關於這個主題寫了一系列的文章(鏈接到下面)。文章非常全面,可以作爲參考資料。雖然他們是特定於SQL Server(T-SQL),一些提到的技術也可以用於其他RDBMS工作(例如使用XML數據類型):

相關問題