0

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 
4

2 に答える 2

6

これは、@emailBody が NULL として開始され、NULL を連結するとデフォルトで NULL になるためです。する

SET @emailBody = '';

スクリプトの先頭に。

また、ストアド プロシージャの先頭にステートメントを追加することを強く検討してSET NOCOUNT ON;ください。NOCOUNT ON を使用しないと、プロシージャの実行が大幅に遅くなる可能性があります。

于 2011-01-07T20:11:40.977 に答える
0

この文字列連結にカーソルが必要なのはなぜですか。次のクエリサフィックスを使用しない

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
于 2011-01-07T20:25:05.527 に答える