0

我希望运行类似于此的 SQL 选择语句

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

使用 ADO.Net SqlClient 样式的@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 字符串返回一个表,如下所示:

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 的一个字符串参数就足够了。

于 2011-02-14T15:54:29.320 回答