Назначение переменной внутри предложения IF EXISTS - PullRequest
21 голосов
/ 22 декабря 2011

Попытка присвоить переменную внутри предложения if Существует для TSQL

DECLARE @myvar  int

IF EXISTS (SELECT @myvar = theTable.varIWant..... )

Я думал, что это будет работать, но, видимо, нет?Или, возможно (более вероятно), я делаю это неправильно.

Ответы [ 4 ]

20 голосов
/ 22 декабря 2011

В моей установке SQL Server 2008 R2 он просто не компилируется. Парсер жалуется на неправильный синтаксис около =.

Я полагаю, что это должно иметь какое-то отношение к смешиванию присваивания значений и извлечению данных в одном операторе SELECT, что недопустимо в SQL Server: вы можете иметь и то, и другое. Поскольку, когда вы присваиваете значения, набор строк не возвращается, а предикат EXISTS ожидает, что он будет , назначение не может быть разрешено в этом контексте, поэтому, чтобы избежать путаницы, возможно, ограничение должно быть наложено явно.

Ваш обходной путь, о котором вы говорите в комментарии, является достойным, но может не сработать где-то в середине пакета, когда переменная уже получила значение перед присваиванием. Таким образом, я бы, вероятно, использовал этот обходной путь вместо:

SELECT @myvar = ...
IF @@ROWCOUNT > 0 ...

Согласно MSDN , системная функция @@ROWCOUNT возвращает количество строк, прочитанных запросом.

7 голосов
/ 26 июля 2013

Вместо того, чтобы делать IF EXISTS, вы можете просто сделать

DECLARE @myvar  int
SELECT @myvar = theTable.varIWant.....;
IF @myvar IS NULL
BEGIN...
1 голос
/ 22 декабря 2011

Это не будет работать только потому, что в конструкции EXISTS сервер sql просто проверяет, существует ли какая-либо строка, и это не имеет значения для столбца выбора или раздела назначения. Это сделано для оптимизации производительности.

0 голосов
/ 28 декабря 2012

Вы пробовали считать?

SELECT @Exists =  CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END
FROM [dbname].[dbo].[tableorviewname];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...