2011-02-14 70 views
0

有多個值,我想運行使用ADO.Net的SqlClient風格@name參數與此類似分配給單個ADO.Net SqlClient中參數

SELECT * FROM CatalogueItems WHERE id IN (1,10,15,20); 

一個SQL SELECT語句。我已經使用存儲在SQL字符串

SELECT * FROM CatalogueItems WHERE id IN (@Ids) 

,然後在我的C#代碼

SqliteCommand command; 
//... 
//returns 0 results 
command.Parameters.Add("@Ids", null).Value = "1,10,15,20"; 

//returns 0 results 
command.Parameters.Add("@Ids", DbType.String).Value = "1,10,15,20"; 

//returns 1 or more results 
command.Parameters.Add("@Ids", null).Value = "1"; 

返回一個空的結果集,但個別字符串參數返回結果嘗試。

此查詢支持?我應該使用另一個DBType嗎?

謝謝。

回答

1

你不能那樣做。 SQL-Server參數必須是單個值。 但你可以看看here動態建立參數列表。

編輯:如果使用SQl-Server> = 2008您可以使用Table-valued parameters建議在this答案。這對我來說是新的,但不幸的是我在2005年。

另一種選擇是創建一個用戶定義的函數,是從您的CSV字符串,因爲這會返回一個表:

CREATE FUNCTION [dbo].[Split] 
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @IDTable TABLE (Item VARCHAR(50)) 
AS  

BEGIN  
    DECLARE @tempItemList NVARCHAR(MAX) 
    SET @tempItemList = @ItemList 

    DECLARE @i INT  
    DECLARE @Item NVARCHAR(4000) 

    SET @tempItemList = REPLACE (@tempItemList, ' ', '') 
    SET @i = CHARINDEX(@delimiter, @tempItemList) 

    WHILE (LEN(@tempItemList) > 0) 
    BEGIN 
     IF @i = 0 
      SET @Item = @tempItemList 
     ELSE 
      SET @Item = LEFT(@tempItemList, @i - 1) 
     INSERT INTO @IDTable(Item) VALUES(@Item) 
     IF @i = 0 
      SET @tempItemList = '' 
     ELSE 
      SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i) 
     SET @i = CHARINDEX(@delimiter, @tempItemList) 
    END 
    RETURN 
END 

那麼你可以使用此功能來分割你的ID,並加入它的結果集。 如此:

SELECT CatalogueItems .* 
FROM CatalogueItems INNER JOIN 
     dbo.Split(@Ids, ',') AS IdList ON CatalogueItems.ID = IdList.Item 

在這種情況下,一個字符串參數對所有ID的就足夠了。

+0

謝謝蒂姆。您提供的鏈接提供了完美的解決方案。乾杯。 – ajmccall 2011-02-15 10:24:07