Присвоение переменной внутри предложения IF EXISTS
Попытка назначить переменную внутри предложения if exists для TSQL
DECLARE @myvar int
IF EXISTS (SELECT @myvar = theTable.varIWant..... )
Я думал, что это сработает, но, видимо, нет? Или, возможно (скорее), я делаю это неправильно.
Ответ 1
В моей установке SQL Server 2008 R2 он просто не компилируется. Парсер жалуется на наличие неправильного синтаксиса рядом с =.
Я полагаю, что он должен иметь какое-то отношение к смещению присвоения значений и извлечению данных в одном операторе SELECT, который не разрешен в SQL Server: у вас может быть один или другой. Поскольку, когда вы назначаете значения, набор строк не возвращается, но предикат EXISTS ожидает, что это назначение не может быть разрешено в этом контексте, поэтому, чтобы избежать путаницы, возможно, ограничение было явно введено.
Ваше обходное решение, о котором вы говорите в комментарии, является достойным, но может плохо работать где-то посередине пакета, когда переменная уже получила значение перед назначением. Поэтому я, вероятно, использовал бы это обходное решение:
SELECT @myvar = ...
IF @@ROWCOUNT > 0 ...
В соответствии с MSDN системная функция @@ROWCOUNT возвращает количество строк, считанных запросом.
Ответ 2
Вместо IF EXISTS вы можете просто сделать
DECLARE @myvar int
SELECT @myvar = theTable.varIWant.....;
IF @myvar IS NULL
BEGIN...
Ответ 3
Это не сработает, потому что в EXISTS сервер sql-сервера просто проверяет, существует ли какая-либо строка, и не имеет значения раздел select-columns или assign.
Это делается для оптимизации производительности.
Ответ 4
Вы пробовали считать?
SELECT @Exists = CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END
FROM [dbname].[dbo].[tableorviewname];