【问题标题】:SQL Server IN Operator using varchar and bigint使用 varchar 和 bigint 的 SQL Server IN 运算符
【发布时间】:2013-03-25 13:14:38
【问题描述】:

我在使用存储过程搜索并使用 SQL IN 运算符返回匹配 ID 列表时遇到了一些问题。我认为这个问题与数据类型有关。

一个参数作为字符串'32,1,5,78,43'传递给存储过程 - 这需要作为 IN 运算符传递到查询中以搜索字段 Column1。 Bigint 中该字段的数据类型。

DECLARE @TEST varchar(1000)
SET @TEST = REPLACE('32,1,5,78,43', '''','')

SELECT Column1, Column2 
FROM Table
WHERE Column1 IN(@TEST)

尝试从字符串中删除引号似乎不起作用,并且我收到一条错误消息“将数据类型 varchar 转换为 bigint 时出错。”

在没有存储过程的情况下运行代码,并将值直接放入 IN 运算符(不带引号)然后可以正常工作并返回正确的值。例如

SELECT Column1, Column2 
FROM Table
WHERE Column1 IN(32,1,5,78,43)

请有人告诉我这里哪里出错了?

【问题讨论】:

  • 这里的答案非常好,但您应该知道您的查询无法正常工作的原因是您的IN 与一个字符串而不是一组整数进行比较。 SQL Server 不能将逗号分隔的字符串隐式转换为一组值。

标签: sql sql-server tsql


【解决方案1】:

您也可以在此使用动态sql

DECLARE @TEST varchar(1000)
DECLARE @SQLQuery AS NVARCHAR(500)

SET @TEST = '32,1,5,78,43'

SET @SQLQuery = 'SELECT Column1, Column2 FROM Table WHERE Column1 IN('+ @TEST +')'
EXECUTE(@SQLQuery)

【讨论】:

    【解决方案2】:

    编写 integer-in-string-list 测试的一种工作方式是:

    DECLARE @TEST varchar(1000)
    SET @TEST = '32,1,5,78,43'
    
    SELECT Column1, Column2 
    FROM Table
    WHERE ',' + @TEST + ',' LIKE '%,' + cast(Column1 as varchar(16)) + ',%'
    

    更好的方法是使用表值参数将强类型整数列表传递给存储过程。

    【讨论】:

      【解决方案3】:

      所以你需要使用动态 SQL,但你不需要在你的情况下转义单引号,只需这样做:

      declare @sql varchar(max)
      set @sql = 'Select Column1, Column2 from Table where Column1 in (' + @test + ')'
      execute (@sql)
      

      【讨论】:

        【解决方案4】:

        您可以使用 Split 函数将逗号分隔的字符串拆分为临时表,然后加入该临时表。

        下面是一个很好的分割字符串的代码示例: T-SQL: Opposite to string concatenation - how to split string into multiple records

        您也可以执行动态 SQL,但这通常不太理想。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-05
          • 1970-01-01
          • 2017-08-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多