C# 在SQL Server中使用阵列

C# 在SQL Server中使用阵列,c#,asp.net,tsql,sql-server-2008,stored-procedures,C#,Asp.net,Tsql,Sql Server 2008,Stored Procedures,我有一个ID的int数组(我可以选择很多复选框),我希望通过存储过程在一个数据库调用中获取这些ID 有没有办法在SQL Server中使用这些ID的数组?我认为应该是拆分数组然后循环它(在sql中)。我只是不知道怎么做 SQL Server 2008有很多方法可以做到这一点: 传入一个由逗号分隔的值的varchar参数,并将其解析出来(效率不高,但对于少量数据,除了解析位之外,还不错) 传入XML并使用内置的XML函数(与早期版本相比,SQL Server 2005+对此有更好的支持) 使用(

我有一个ID的int数组(我可以选择很多复选框),我希望通过存储过程在一个数据库调用中获取这些ID

有没有办法在SQL Server中使用这些ID的数组?我认为应该是拆分数组然后循环它(在sql中)。我只是不知道怎么做


SQL Server 2008有很多方法可以做到这一点:

  • 传入一个由逗号分隔的值的varchar参数,并将其解析出来(效率不高,但对于少量数据,除了解析位之外,还不错)
  • 传入XML并使用内置的XML函数(与早期版本相比,SQL Server 2005+对此有更好的支持)
  • 使用(SQL Server 2008+)

因为您使用的是SQL Server 2008,所以请使用表值参数。

我认为您需要类似于

Declare @query as varchar(500)
Declare @valuesList as varchar(100)
set @valuesList = '1,2,3'
set @query = 'select * From tableName where id in ( ' + @valuesList + ')'
exec(@query)

编辑:下面的示例

正如@Oded所提到的,表值参数是最好的选择

但是,如果由于某些原因无法使用这些(可能是调用框架的限制),则可以使用以下方法执行拆分到表:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[SplitToTable]
(   
    @List varchar(max), @Delim varchar(1)
)
RETURNS TABLE 
AS
RETURN
(
    WITH csvtbl(Start, [Stop]) AS (
        SELECT      Start = convert(bigint, 1), [Stop] = 
                    charindex(@Delim COLLATE Slovenian_BIN2, @list + @Delim)
        UNION ALL
        SELECT      Start = [Stop] + 1, [Stop] = charindex(@Delim 
                    COLLATE Slovenian_BIN2, @list + @Delim, [Stop] + 1)
        FROM        csvtbl
        WHERE       ([Stop] > 0)
    )
    SELECT      substring(@list, Start, CASE WHEN [Stop] > 0 THEN [Stop] - 
                Start ELSE 0 END) AS Value
    FROM        csvtbl
    WHERE       ([Stop] > 0)
)
您需要知道默认的递归深度为100。如果这还不够,请通过在外部调用查询中添加以下内容来增加它:

OPTION (MAXRECURSION 1000)  -- or 0 for unlimited
示例

SELECT *
FROM   MyTable as t
WHERE  t.ID IN (
       SELECT *
       FROM   dbo.SplitToTable('1,2,12,34,101', ',')
       )

它也可以用于连接等。

以反转该过程

DECLARE @t TABLE
(
    ID int
)

INSERT INTO @t
VALUES (1), (3), (5), (7), (9)

SELECT  STUFF(
        (
            SELECT  ',' + CAST(t.ID AS VARCHAR(10))
            FROM    @t t
            FOR     XML PATH('')
        ), 1, 1, '') AS CSV

礼貌。

您使用的是哪一版本的SQL server?是否要传递或获取阵列I将阵列传递给存储过程并基于这些ID返回数据s@meep,绝对合适。试试看:)这是件坏事。即使我使用数据库参数,在这个解决方案中仍然允许SQL注入。这是一个糟糕的解决方案。使用表值参数(SQLServer2008+),如@Oded所说。您能提供一个使用此函数的示例吗?这非常有用。是否可能有一个反向函数,它接受一个表并以字符串数组的形式返回它?