在SQL中创建带有嵌入式引号的字符串

时间:2015-03-21 00:12:33

标签: sql-server string variables

我运行了几个在where子句中使用字符值列表的查询,例如

select  *
from    table1
where   col1 in ('a','b','c')

字符列表经常更改,因此我希望将字符串存储在变量中,并在所有查询中引用该变量,而不是保留字符串的多个副本。我尝试了以下但查询返回零行。

declare @str varchar(50)
select @str = '''a''' + ',' + '''b'''+ ',' + '''c'''
select  *
from    table1
where   col1 in (@str)

@str的值为'a','b','c',但由于某种原因,SQL Server无法识别它。如何构建字符串并将其存储在与in关键字一起使用的变量中?

2 个答案:

答案 0 :(得分:0)

可以创建带嵌入引号的字符串。正如Fredou和ChrisS所提到的,@ str被认为是一个字符串。如果@str值与select语句的其余部分连接在一起然后执行,您将获得所需的结果。 SQL小提琴example

declare @str varchar(50)
declare @sql varchar(MAX)

select @str = '''a''' + ',' + '''b'''+ ',' + '''c'''    

Select @sql = 'SELECT * FROM table1 WHERE col1 IN (' + @str + ')'

Exec(@sql)

结果使用@str ='''''' +',' +''''' +',' +''''''

enter image description here


结果使用@str ='''''' +',' +''''''

enter image description here

答案 1 :(得分:0)

SQL中的IN构造作为集合查找,而不是字符串查找。您的单个字符串值为"''''''''''''当你在评论中提到col1 in(@str)的时候正是它正在寻找的......正如Fredou在评论中提到的那样。

相反,您希望使用表变量(或临时表)传递一组值:

declare @tabIn table ( val varchar(10) )
insert @tabIn
    (val) values
    ('a'), ('b'), ('c')

select *
    from table1
    where
        col1 in (select val from @tabIn)

或者,只是直接加入:

declare @tabIn table ( val varchar(10) )
    insert @tabIn
        (val) values
        ('a'), ('b'), ('c')

select *
    from table1 t1
    join @tabIn t2 on
        t1.col1 = t2.val