0

これに似たSQLselectステートメントを実行したい

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

ADO.NetSqlClientスタイルの@nameパラメーターを使用します。保存された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はありますか?

ありがとう。

4

1 に答える 1

1

そんなことはできません。SQL-Server パラメータは単一の値である必要があります。ただし、パラメーター リストを動的に作成するには、こちらを参照してください。

編集: SQl-Server >=2008 を使用している場合は、この回答で提案されているように、テーブル値パラメーターを使用できます。それは私にとって新しいことですが、残念ながら私は2005年です。

別のオプションは、次のように csv-string からテーブルを返すユーザー定義関数を作成することです。

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 に対して 1 つの文字列パラメータで十分です。

于 2011-02-14T15:54:29.320 に答える