C# 在SQL Server中使用阵列
我有一个ID的int数组(我可以选择很多复选框),我希望通过存储过程在一个数据库调用中获取这些ID 有没有办法在SQL Server中使用这些ID的数组?我认为应该是拆分数组然后循环它(在sql中)。我只是不知道怎么做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+对此有更好的支持) 使用(
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所说。您能提供一个使用此函数的示例吗?这非常有用。是否可能有一个反向函数,它接受一个表并以字符串数组的形式返回它?