SQL中的变量“IN”表达式

时间:2011-02-11 22:09:14

标签: sql sql-server-2005

  

可能重复:
  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的知识,我不确定我是否甚至会问一个有意义的问题。我很感激任何指导!

4 个答案:

答案 0 :(得分:4)

这比你在SQL Server 2005中想象的要复杂得多(2008年有表值参数,这使得它更容易)

请参阅http://www.sommarskog.se/arrays-in-sql-2005.html以查看方法。

答案 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