Курсор SQL в хранимой процедуре для заполнения строковой переменной - PullRequest
0 голосов
/ 07 января 2011

У меня есть хранимая процедура, которая содержит курсор для циклического просмотра записей SQL и заполняет строку, которую я буду использовать позже в качестве текста своей электронной почты. Я пытаюсь распечатать его, чтобы проверить, прежде чем продолжить, но, похоже, строка не заполняется. Вот моя хранимая процедура в SQL Server 2005.

CREATE PROCEDURE [dbo].[spBody] 
AS
DECLARE @MyCursor CURSOR
DECLARE @emailBody nvarchar(max)
DECLARE @statusName nvarchar(max)
DECLARE @deptCode nvarchar(max)
DECLARE @instructors nvarchar(max)
DECLARE @meetingTime nvarchar(max)

SET @MyCursor = CURSOR FAST_FORWARD For
Select StatusName, DeptCode, Instructors, Description from MyTable where StatusID = (select CAST(value AS INT) from Table2 where ConfigOption = 'RequiredStatus')

Open @MyCursor
FETCH NEXT FROM @MyCursor INTO @statusName, @deptCode, @instructors, @meetingTime


WHILE @@FETCH_STATUS = 0

BEGIN
 SET @emailBody = @emailBody + @statusName + ' ' + @deptCode + ' ' + @instructors + ' ' + @meetingTime 
 FETCH NEXT FROM @MyCursor INTO @statusName, @deptCode, @instructors, @meetingTime

END
CLOSE @MyCursor
Print @emailBody

DEALLOCATE @MyCursor 

Ответы [ 2 ]

6 голосов
/ 07 января 2011

Это потому, что @emailBody начинается с NULL, и любая конкатенация с NULL по умолчанию дает NULL.Сделайте

SET @emailBody = '';

в начале вашего скрипта.

Также настоятельно рекомендуем добавить оператор SET NOCOUNT ON; в верхней части вашей хранимой процедуры - отсутствие NOCOUNT ON может сильно замедлитьвыполнение вашего прока.

0 голосов
/ 07 января 2011

Зачем вам нужен курсор для этой строки concat?Не используйте следующий суффикс запроса

DECLARE @emailBody nvarchar(max) 

Set @emailBody = ''

Select @emailBody = @emailBody + StatusName + ' ' + DeptCode + ' ' + Instructors + ' ' + [Description] from MyTable where StatusID = (select CAST(value AS INT) from Table2 where ConfigOption = 'RequiredStatus')

Print @emailBody
...