在SQL WHERE子句的变量中使用带引号的值字符串

在SQL WHERE子句的变量中使用带引号的值字符串,sql,sql-server,variables,where,quotes,Sql,Sql Server,Variables,Where,Quotes,我想不出答案…也许是因为这是不可能的 有效的例子 SELECT * FROM TABLEA WHERE FIELD1 IN ('aaa','bbb','ccc') 不起作用的例子 尝试利用变量,以便在一个语句字符串中定义一次值 DECLARE @ListValues VARCHAR(50) SET @ListValues = '''aaa'',''bbb'',''ccc''' SELECT * FROM TABLEA WHERE FIELD1 IN (@ListValues) 这显然只是

我想不出答案…也许是因为这是不可能的

有效的例子

SELECT * FROM TABLEA WHERE FIELD1 IN ('aaa','bbb','ccc')
不起作用的例子

尝试利用变量,以便在一个语句字符串中定义一次值

DECLARE @ListValues VARCHAR(50)

SET @ListValues = '''aaa'',''bbb'',''ccc'''

SELECT * FROM TABLEA WHERE FIELD1 IN (@ListValues)
这显然只是方程式的一小部分,还有其他原因

我无法利用表来获取值并将其更改为真正的子查询

我能找到的最接近的问题是这个。。。但显然不包括我的要求。。。


提前感谢。

您可以使用动态SQL:

DECLARE @ListValues VARCHAR(MAX)
       ,@SQL VARCHAR(MAX)
SELECT @ListValues = '''aaa'',''bbb'',''ccc'''
      ,@SQL = 'SELECT * FROM TABLEA WHERE FIELD1 IN ('+@ListValues+')'
EXEC (@SQL)

它不起作用,因为中的
操作符需要一个项列表,这里是字符串

但是,
@ListValues
变量提供的是一个字符串,而不是字符串列表

您可以使用表变量并将值存储在其中:

DECLARE @ListOfValues TABLE (ItemName VARCHAR(50))

INSERT INTO @ListOfValues(ItemName) 
VALUES('aaa'), ('bbb'), ('ccc')

SELECT *    
FROM TABLEA 
WHERE FIELD1 IN (SELECT ItemName FROM @ListOfValues)

动态构建整个SQL查询(假设它存储在字符串变量
@SQL
)中,
然后用
EXEC(@sql)
执行它。更好的方法是使用
sp_executesql
sp
因为这种方法比
EXEC
更安全(不太容易SQL注入)


请参阅:

SQLServer中的
操作符中的
需要一个值列表,如果变量是单个字符串,则解析的查询将不同

SELECT * FROM TABLEA WHERE FIELD1 IN ('aaa','bbb','ccc')
SELECT * FROM TABLEA WHERE FIELD1 IN ("'aaa','bbb','ccc'")
注意:双引号仅用于可读性,以获取包含单引号的字符串

如果您知道一种编程语言,第一种语言就像在数组中搜索,第二种语言是字符串

要在变量中存储列表,需要将其存储到表中

DECLARE @varTable TABLE (field1 varchar())
这样您就可以在

SELECT * FROM TABLEA WHERE FIELD1 IN (SELECT field1 FROM @varTable)

要向表格变量添加值,请像表格一样使用
INSERT
statement。

感谢marc_s的重新格式化,我看到了post的结果,并且正在执行相同的操作…检查答案…询问。我认为在概念上我更喜欢表值函数版本。