【问题标题】:Variable "IN" expression in SQL [duplicate]SQL中的变量“IN”表达式[重复]
【发布时间】:2011-02-11 22:09:13
【问题描述】:

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

【问题讨论】:

  • 这个问题很有道理。首先,您使用的是什么编程语言/环境?另外,您的查询是在存储过程中还是在程序中直接作为字符串执行?
  • 您遇到的问题是您实际上想要创建一个 x 类型的集合/数组以在 IN 子句中使用。看看stackoverflow.com/questions/519769/…
  • 我的查询在存储过程中,使用 MS SQL Server 2005。
  • 如果您使用 C#,请参阅 stackoverflow.com/questions/337704/…
  • 很抱歉,您可能提出了一个重复的问题 :(。有时在您第一次学习时很难知道要搜索什么。不过,感谢您为我指明了正确的方向。

标签: sql sql-server-2005


【解决方案1】:

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

查看http://www.sommarskog.se/arrays-in-sql-2005.html查看这些方法。

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

      另一种方法是构建一个sql字符串并使用execute来执行它。该字符串是“INSERT...SELECT form”并将结果插入到临时表中。然后你从温度中选择。

      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
      

      【讨论】:

        【解决方案4】:

        你在这里为 sql server 2005 和之前所做的是将用户参数放在一个表中,然后从表中选择:

        select columns 
        from books 
        where type in 
            (
             select choices 
             from userchoices 
             where sessionkey= @sessionkey and userid= @userid
            )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-11
          • 2017-11-04
          • 1970-01-01
          • 2016-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多