Использование одинарных кавычек в параметре SQL - PullRequest
0 голосов
/ 26 января 2012

Мне интересно, почему эти два следующих условия в SQL возвращают разные результаты

Первое состояние
Я пишу запрос следующим образом:

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

И он возвращает идентификатор пользователя для каждого имени пользователя, ниже выводится

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 ]

2 голосов
/ 26 января 2012

@ 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, '');

Некоторые идеи для разделения здесь: Передача varchar, полного значений, разделенных запятыми, в функцию SQL Server IN

1 голос
/ 26 января 2012

Ваше второе условие пытается найти одно имя пользователя "'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+'%' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...