将多个值分配给单个 ADO.Net SqlClient 参数

发布于 2024-10-17 20:37:06 字数 639 浏览 3 评论 0原文

我希望

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

使用 ADO.Net SqlClient 样式 @name 参数运行与此类似的 SQL 选择语句。我尝试使用存储的 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 吗?

谢谢。

I wish to run an SQL select statement similar to this

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

using ADO.Net SqlClient style @name parameters. I've tried using a stored SQL strings

SELECT * FROM CatalogueItems WHERE id IN (@Ids)

and then in my C# code

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";

returns an empty result set, yet the individual string parameters return results.

Is this query support? Is there another DBType I should be using?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

葮薆情 2024-10-24 20:37:06

你不能那样做。 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 的一个字符串参数就足够了。

You can't do that. A SQL-Server parameter must be a single value.
But you could have a look here to build the parameter list dynamically.

Edit: if using SQl-Server >=2008 you could use Table-valued parameters as suggested in this answer. It's new to me, but i'm on 2005 unfortunately.

Another option would be to create a user-defined-function that returns a table from your csv-string as this:

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  

Then you could use this function to split your ID's and join it with your result set.
Such as this:

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

In this case one string-parameter for all ID's is sufficient.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文