我碰到类似的问题,在这里我需要在我的选择查询IN,并在运行时改变元素的数量。
我使用参数化查询在存储过程的形式,并通过包含的东西我要找的列表分隔字符串。逃生由系统自动处理,不需要采取非凡的步骤。最好不要使用您正在搜索的文本中的字符(如逗号)分隔它们。竖条(“|”)在许多情况下可能效果最好。
顺便说一句,请确保您的表中的CRLFs是CHAR(13)+ CHAR(10),因为相反的方法不是\ r \ n,并且如果Environment.NewLine是part的搜索。
下面是使用一个快速和肮脏的解析解析到一个表,我已经使用了一个存储过程:
CREATE PROCEDURE FindBooks
(
@list varchar(500)
)
AS
CREATE TABLE #parse_table (item varchar(500))
DECLARE @temp VARCHAR(500)
DECLARE @result VARCHAR(500)
DECLARE @str VARCHAR(500)
DECLARE @pos SMALLINT
SET @temp = RTRIM(LTRIM(@list))
SET @pos = 1
WHILE @pos > 0
BEGIN
SET @pos = CHARINDEX('|',@temp)
IF @pos > 0
BEGIN
SET @result = SUBSTRING(@temp,1,@pos - 1)
SET @temp = RTRIM(LTRIM(SUBSTRING(@temp,@pos+1,LEN(@temp) - @pos)))
INSERT INTO #parse_table
SELECT @result
END
ELSE
INSERT INTO #parse_table
SELECT @temp
END
SELECT * FROM Books WHERE Title in (select * from #parse_table)
只需创建您的书名的列表作为一个简单的字符串(含任何嵌入式单引号,CRLFs和等等)并使用参数化查询。当然,您的存储过程除了分隔列表外还可以包含其他内容。
这是一条切线的评论,但仍然很重要。如果你在管理工作室为你自己的查询做这件事,那很好。但是,如果你正在做这个_programmatically_ —建立你的查询字符串,并在客户端程序— __你做错wrong_。您需要参数化查询。 – 2009-08-12 15:25:29
你的建议,你需要运行1选择参数的每个值是不正确的。使用Table-Valued-Parameter OR XML或使用逗号分隔字符串并在SQL Server端将其解压缩。这将是一个查询。 http://www.sommarskog.se/arrays-in-sql-2008.html – Davos 2014-02-18 01:46:56