c# - SQL Server (2008) 将 ArrayList 或字符串传递给 SP 以进行 IN()

标签 c# asp.net sql sql-server database

我想知道如何传递 ArrayList、List <int > 或 StringBuilder 逗号分隔列表到存储过程,以便我使用 IN() 查找 ID 列表:

@myList varchar(50)

SELECT  *
FROM    tbl
WHERE   Id IN (@myList)

在 C# 中,我当前正在将列表构建为以逗号分隔的字符串;但是,例如,当使用 nvarchar(50) 作为存储过程中参数的类型时 - 我收到错误,因为它无法将 '1,2,3' 转换为 IN() 之间期望的 int。

有什么想法吗?非常感激。
皮特

最佳答案

您可以使用用户定义的函数,例如

CREATE function [dbo].[csl_to_table] ( @list nvarchar(MAX) )
RETURNS @list_table TABLE ([id] INT)
AS
BEGIN
    DECLARE     @index INT,
            @start_index INT,
            @id INT

    SELECT @index = 1 
    SELECT @start_index = 1
    WHILE @index <= DATALENGTH(@list)
    BEGIN

        IF SUBSTRING(@list,@index,1) = ','
        BEGIN

            SELECT @id = CAST(SUBSTRING(@list, @start_index, @index - @start_index ) AS INT)
            INSERT @list_table ([id]) VALUES (@id)
            SELECT @start_index = @index + 1
        END
        SELECT @index  = @index + 1
    END
    SELECT @id = CAST(SUBSTRING(@list, @start_index, @index - @start_index ) AS INT)
    INSERT @list_table ([id]) VALUES (@id)
    RETURN
END

它接受 nvarchar 逗号分隔的 id 列表,并以整数形式返回这些 id 的表。然后,您可以像这样加入存储过程中返回的表 -

DECLARE @passed_in_ids TABLE (id INT)

INSERT INTO @passed_in_ids (id)
  SELECT 
    id 
  FROM
    [dbo].[csl_to_table] (@your_passed_in_csl)

SELECT *
FROM 
myTable
INNER JOIN
@passed_in_ids ids
ON
myTable.id = ids.id

关于c# - SQL Server (2008) 将 ArrayList 或字符串传递给 SP 以进行 IN(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/519769/

相关文章:

sql - 如何提取<CFQUERY>的WHERE子句中的子字符串?

c# - 使用 Angular 通过 Ajax 下载文件

c# - 内线程异常处理

c# - 为什么附加字段 "Specified"的字段总是空的?

c# - Url.Action 假定额外的 RouteValue

c# - Ninject:将接口(interface)绑定(bind)到多个实现

asp.net - iframe不显示源链接

mysql - 动态将行转换为列

php - SQL查询从3个表中选择多对多

c# - 当 C# 超出范围时,C# 是否自动将 "dispose"IDisposable 对象?