在SQL参数中使用单引号

时间:2012-01-26 04:07:18

标签: sql sql-server-2005

我想知道为什么SQL中的这两个条件会返回不同的结果

第一个条件
我写的查询如下:

DECLARE @idUser VARCHAR(MAX)
SELECT @idUser = COALESCE(@idUser+', ' , '') + CAST(idUser as VARCHAR(MAX))
FROM webuser
WHERE username IN ('John', 'Tom')

它返回每个用户名的用户ID,下面是给定的输出

1020, 1021


第二个条件
我写了另一个不同的查询。用户名已经设置为参数,这实际上是我需要的,用户名设置为参数,下面是使用的查询:

DECLARE @username VARCHAR(MAX)
SET @username = '''John'', ''Tom'''
DECLARE @idUser VARCHAR(MAX)
SELECT @idUser = COALESCE(@idUser+', ' , '') + CAST(idUser as VARCHAR(MAX))
FROM webuser
WHERE username IN (@username)

结果返回NULL值。

我期待这两个查询返回相同的输出,我认为这是关于@username中的引用,我做错了还是你们对这个案例有任何解释和解决方案?

2 个答案:

答案 0 :(得分:2)

@username是单个字符串变量,而不是字符串数组。因此,您替换变量的查询是在表中查找值为'John', 'Tom'的单个用户名,而不是两个单独的值'John''Tom' ... SQL Server不知道数组是什么,并且无法将该字符串转换为多个值。

您需要先使用动态SQL或拆分值。

动态SQL:

DECLARE 
    @s VARCHAR(MAX),
    @username VARCHAR(MAX);

SELECT 
    @s = '', 
    @username = '''John'', ''Tom''';

DECLARE @sql NVARCHAR(MAX);
SELECT @sql  = N'SELECT @s = @s + '',''
    + CONVERT(VARCHAR(MAX), idUser) 
  FROM dbo.webuser
  WHERE username IN (' + @username + ');';

EXEC sp_executesql 
    @sql, 
    N'@s VARCHAR(MAX) OUTPUT', 
    @s = @s OUTPUT;

PRINT STUFF(@s, 1, 1, '');

有关分裂的一些想法:Passing a varchar full of comma delimited values to a SQL Server IN function

答案 1 :(得分:1)

您的第二个条件是尝试查找不存在的单个用户名“'John', 'Tom'”。为了在您的查询中以您想要的方式使用此字符串,您需要动态SQL,或者您可以使用LIKE,如:

DECLARE @username VARCHAR(MAX) 
SET @username = '!John, !Tom' 
DECLARE @idUser VARCHAR(MAX) 
SELECT @idUser = COALESCE(@idUser+', ' , '') + CAST(idUser as VARCHAR(MAX)) 
FROM webuser 
WHERE @username LIKE '%!'+username+'%'