SQLCMD — задание SQL Server

предположим, ниже мой запрос.

DECLARE @INT INT
SET @INT = (SELECT COUNT(1) FROM MyTable)
IF (@INT = 0)
RAISERROR('Fail',16,1)

Я хочу использовать этот запрос и создать задание SQL Server, используя тип «Операционная система (CmdExec)». Я хочу, чтобы шаг SQL Job был успешным, если @INT ‹> 0, и не выполнялся, если @INT = 0.

Как я могу написать cmd?

Моя попытка (и она не работает)... сервер отличается от того, где я буду настраивать работу.

sqlcmd -S 123.45.67.890 -E -V15 -d MyDB -Q "DECLARE @INT INT
SET @INT = (SELECT COUNT(1) FROM MyTable)
IF (@INT = 0)
RAISERROR('Fail',16,1)" -b

Сообщение о сбое работы.

Выполняется от имени пользователя: LocalSVR\USER. Сообщение 105, уровень 15, состояние 1, сервер RemoteSVR, строка 1 Незакрытые кавычки после строки символов «DECLARE @INT INT». Код завершения процесса 15. Шаг не выполнен.

Обратите внимание, что этот шаг не выполняется по той же причине, когда MyTable имеет более 1 записи.

Обновление: по предложению Скотта я изменил форматирование (убрал разрывы строк), и, похоже, это работает. @ Скотт, не знаю, как пометить твой комментарий как ответ. Если вы можете написать ответ, я отмечу его как ответ. Ваше здоровье!!!


person 007    schedule 03.11.2014    source источник
comment
Это именно так, как это отформатировано в вашей работе? Sqlcmd, вероятно, не нравится, когда ваш запрос занимает несколько строк. Если вы удалите разрывы строк, это может сработать.   -  person Scott Teibert    schedule 04.11.2014
comment
Эм... вау!! думаю, это все.. лол Спасибо @ScottTeibert за этот совет. Ваше здоровье!   -  person 007    schedule 04.11.2014


Ответы (1)


Вы пытаетесь выполнить несколько строк, а не один запрос. Вы можете обойти это, используя IF NOT EXISTS

SQLCMD -b -S"MyServer" -d"MyDatabase" -Q"IF NOT EXISTS(SELECT * FROM MyTable) RAISERROR('Fail',16,1)"

Обратите внимание, что параметр -b (при прерывании пакета ошибок) означает, что сам SQLCMD не даст вам Trappable ErrorLevel.

person Tom Page    schedule 02.08.2016