SQL Server(2008)将ArrayList或String传递给IN()
问题描述:
我想知道如何将ArrayList,List <int
>或StringBuilder逗号分隔列表传递给存储过程,以便我找到使用ID的列表IN():SQL Server(2008)将ArrayList或String传递给IN()
@myList varchar(50)
SELECT *
FROM tbl
WHERE Id IN (@myList)
在C#中我目前建立的列表是一个字符串,这是一个逗号定界;然而,例如,当使用nvarchar(50)作为存储过程中param的类型时 - 我得到一个错误,因为它不能将'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
它接受逗号分隔的ID列表一个nvarchar并返回这些ID为int的表。然后,您可以在返回的表中加入您的存储过程,像这样 -
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
答
在SQL 2008有表值参数,使一个友好的替代解析CSV;看到这里为example。
否则,另一种选择是xml - SQL Server中的xml
数据类型允许您非常容易地读取此内容(尽管需要更多传输字节)。
我已经把函数调用的id放到表变量中,以防您需要在存储过程的多个地方使用这些值,您只需要调用一次函数 – 2009-02-06 10:54:20