2011-01-07 60 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