2011-01-07 66 views
0

我有一个存储过程,其中包含一个游标循环通过SQL记录并填充字符串,我将稍后用作我的电子邮件文本。我试图打印出来验证之前,我可以继续它,但它似乎不填充字符串。下面是在SQL Server 2005存储过程中的SQL游标填充字符串变量

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 

回答

6

这是因为@emailBody开始为NULL,并用NULL任何拼接默认生成NULL我的存储过程。做一个

SET @emailBody = ''; 

在您的脚本的开始。

此外,强烈考虑在存储过程的顶部添加SET NOCOUNT ON;语句 - 没有NOCOUNT ON会极大地降低proc的执行速度。

+0

这是一个可以让你在SQL中疯狂的人。 NULL加上任何等于NULL,字符串的默认值为NULL。大抓@Dave Markle! – 2011-01-07 20:13:47

+0

非常感谢您的快速回复:)它现在正常工作:) – Deepak 2011-01-07 20:23:46

0

为什么你需要一个指向这个字符串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