Передача результата курсора в send_dbmail в качестве параметра - PullRequest
0 голосов
/ 07 мая 2018

Я никогда раньше не работал с курсорами, и после прочтения это может быть не самым лучшим подходом, поэтому во что бы то ни стало вносит предложения.

Я пытаюсь передать результирующий набор курсора взапрос.Вот что у меня есть:

DECLARE @PM varchar(50),
        @c1 as CURSOR
SET @c1 = CURSOR FOR
    SELECT PM
    FROM PMtable

OPEN @c1;
FETCH NEXT FROM @c1 INTO @PM;

WHILE @@FETCH_STATUS = 0
    BEGIN
        DECLARE @emailBody nvarchar(max)
        SET @emailBody = 'SELECT * FROM othertable WHERE PM = ' + @PM + ' ORDER BY PM';

        EXEC msdb.dbo.sp_send_dbmail
        @recipients = 'me@me.com',
        @subject = 'test',
        @query = @emailBody;

FETCH NEXT FROM @c1 INTO @PM;
END
CLOSE @c1;
DEALLOCATE @c1;

Идея состоит в том, чтобы отправлять набор результатов запроса @emailBody в виде электронной почты для каждого результата в курсоре.Например, скажем, курсор возвращает три результата: Боб, Джим и Джо.Я хочу выполнить цикл @emailBody для каждого результата из курсора и отправить электронное письмо для каждого результата.

Когда я запускаю запрос как есть, я получаю сообщение об ошибке:

Сообщение 22050, Уровень 16, Состояние 1, Строка 0 Ошибка запроса форматирования, возможно, недопустимые параметры

Сообщение 14661, Уровень 16, Состояние 1, Процедура sp_send_dbmail, Строка 504 [Стартовая строка 0]

Не удалось выполнить запрос:

Сообщение 207, Уровень 16, Состояние 1, Сервер СЕРВЕР, Строка 9 Неверное имя столбца «Боб».

Сообщение 207, Уровень 16, Состояние 1, Сервер СЕРВЕР, Строка 1 Неверное имя столбца «Боб».

Понятия не имею, что происходит.Есть идеи?

1 Ответ

0 голосов
/ 07 мая 2018

Вам нужно добавить '':

SET @emailBody='SELECT * FROM othertable WHERE PM = ''' + @PM + ''' ORDER BY PM';

Помните о возможном внедрении SQL.


Как это работает:

Сообщение 207, Уровень 16, Состояние 1, Сервер СЕРВЕР, Строка 9 Недопустимое имя столбца 'Bob'.

SELECT * FROM othertable WHERE PM = Bob ORDER BY PM 
vs.
SELECT * FROM othertable WHERE PM = 'Bob' ORDER BY PM

Имейте в виду, что ORDER BY PM для одного значения ничего не меняет.

...