可能重复:
SQL Multiple Parameter Values
SQL Server (2008) Pass ArrayList or String to SP for IN()
我想从表中选择一些具有某些值的行,这些值在写入存储过程时是未知的。例如,在库数据库中搜索特定类型的书籍:
SELECT * FROM Books WHERE Type IN (_expr_);
根据用户的选择,我希望_expr_
成为('Humor', 'Thriller')
一次运行,然后('Education')
成为下一次运行。如何在运行时更改表达式?
不幸的是,我仍然有很多关于SQL的知识,我不确定我是否甚至会问一个有意义的问题。我很感激任何指导!
答案 0 :(得分:4)
这比你在SQL Server 2005中想象的要复杂得多(2008年有表值参数,这使得它更容易)
答案 1 :(得分:2)
我觉得我之前已经回答了这个问题......
无论如何,我长期使用以下用户定义的分割功能:
用法:dbo.Split(“@ ParamName”,“,”),其中第二个参数是分隔符。
然后,您可以将其连接到表中,因为它返回带有elementID和Element的表值函数。
CREATE FUNCTION [dbo].[Split]
(
@vcDelimitedString varchar(max),
@vcDelimiter varchar(100)
)
RETURNS @tblArray TABLE
(
ElementID smallint IDENTITY(1,1), --Array index
Element varchar(1000) --Array element contents
)
AS
BEGIN
DECLARE @siIndex smallint, @siStart smallint, @siDelSize smallint
SET @siDelSize = LEN(@vcDelimiter)
--loop through source string and add elements to destination table array
WHILE LEN(@vcDelimitedString) > 0
BEGIN
SET @siIndex = CHARINDEX(@vcDelimiter, @vcDelimitedString)
IF @siIndex = 0
BEGIN
INSERT INTO @tblArray VALUES(@vcDelimitedString)
BREAK
END
ELSE
BEGIN
INSERT INTO @tblArray VALUES(SUBSTRING(@vcDelimitedString, 1,@siIndex - 1))
SET @siStart = @siIndex + @siDelSize
SET @vcDelimitedString = SUBSTRING(@vcDelimitedString, @siStart , LEN(@vcDelimitedString) - @siStart + 1)
END
END
RETURN
END
答案 2 :(得分:1)
你在sql server 2005和之前做的是把用户参数放在一个表中,然后从表中选择:
select columns
from books
where type in
(
select choices
from userchoices
where sessionkey= @sessionkey and userid= @userid
)
答案 3 :(得分:1)
另一种方法是构建一个sql字符串并使用execute来执行它。该字符串是“INSERT ... SELECT form”,并将结果插入临时表中。然后从temp中选择。
declare @sql varchar(1000)
set @sql = 'INSERT INTO sometemptable SELECT * FROM Books WHERE Type IN ('
set @sql = @sql + {code that builds a syntactically correct list}
set @sql = @sql + ')'
execute @s_sql
select * from sometemptable