Я пытаюсь настроить запрос, чтобы он сравнивал две даты из двух разных таблиц, и если они равны, запрос завершается. Если они не равны, тогда запрос будет продолжен и вставлены некоторые вещи. Однако я не могу понять, как заставить его делать то, что я хочу.
SELECT TOP(1) @dateA=a.someDate
FROM a
ORDER BY DESC;
SELECT TOP(1) @dateB=b.someDate
FROM b
ORDER BY DESC;
CASE WHEN @dateA=@dateB THEN raiseerror('dates equal',20,-1) with log;
Insert statements;
Любая помощь будет очень признательна.
sql-server
t-sql
thejoker34
источник
источник
CASE
- SQL Server имеет толькоCASE
выражение.Ответы:
CASE
является выражением (не выражением) и не может использоваться для управления потоком подобным образом - не вызывать команды, не возвращать более одного столбца / значения, не использоваться в качестве отдельной команды.Мне кажется, вы можете просто использовать,
IF
чтобы поднять ошибку, когда даты равны, иначе запустите вставки.Вы также можете сделать это по-другому. Запускайте вставки, только если даты не совпадают , иначе выведите ошибку:
Если вы думали использовать ошибку только с целью получения из запуска вставок, то вы можете просто удалить все из
ELSE
пуха, так как единственный способ вставки будет работать, когда@dateA
и@dateB
является не равно :Я сократил путь назад к тому, чтобы быть педантичным по отношению к таким вещам, как строки (против «записей») и столбцов (против «полей»), но целое выражение и операторная вещь - очень важное различие, именно по этой причине. Смотрите « Грязные секреты выражения CASE ».
источник
NULL
. Это все еще хорошее наблюдение, что две версии, которые предоставляет Аарон, будут делать разные вещи в этом случае.Используйте
IF
вместоCASE
Это, конечно, предполагает, что вы действительно хотите вызвать ошибку. Другой вариант будет:
Теперь обратите внимание на
BEGIN
иEND
. Это будет важно.IF
утверждение (аELSE
) влияет только на правильную команду под ним. Если вам нужно более одной команды, вам нужно начать и закончить .источник
В других ответах указывалось, что CASE является выражением , а не утверждением, и поэтому не может само по себе охватывать утверждения (как
RAISEERROR
и любые другие). Если условий не так много, особенно если это всего лишь одно условие, утверждение IF является идеальным выбором для того, что вы пытаетесь сделать, как уже упоминалось.Тем не менее, в зависимости от вашего сценария, выражение CASE все еще может использоваться, но не совсем так, как вы показали. В частности, если нужно проверить много условий, когда совпадение должно приводить к одному и тому же набору действий (например, вызвать исключение и завершить сценарий), вы можете использовать выражение CASE в операторе присваивания, хранящем результат CASE, а затем выполнить это с помощью IF, проверяющего сохраненный результат и выполняющего необходимые действия, если необходимо, например, так:
В этом случае необходимое действие вызывает исключение, но сообщение, возвращаемое с исключением, должно зависеть от того, какое условие было проверено первым. Оператор присваивания использует выражение CASE, чтобы выбрать, какое сообщение хранить в
@ErrorMessage
переменной.Вы также можете видеть, что ошибка возникает только условно - только если переменная действительно содержит сообщение для показа. Если значение является пустой строкой или пустым, сценарий будет продолжаться без прерывания.
источник
Вам нужны переменные?
источник