MSSQL Cursor将所有行返回到单个列中

时间:2014-06-30 11:02:13

标签: sql-server

我试图使用以下存储过程从MSSQL CURSOR返回所有图像名称的列表作为单个结果:

PROCEDURE [dbo].[GetPhotosByPropId]
    @propId bigint
AS
    DECLARE @AllPhotos nvarchar(MAX) 
    DECLARE @PhotoName nvarchar(500) 
    DECLARE @BaseURL nvarchar(200) 
    DECLARE @PhotosCursor CURSOR
    DECLARE @PhotosCount int


    -- Take Photo Count
    SET @PhotosCount = (SELECT Count(*) FROM [ART].[dbo].[STR_FK_PropertyPhoto] Where PropId = @propId)

    -- Take all photos in Cursor
    SET @PhotosCursor = CURSOR FAST_Forward For
     SELECT [Photo_File_Name],[Base_URL]
       FROM [ART].[dbo].[STR_FK_PropertyPhoto]
      WHERE PropId = @propId

    -- OPEN CURSOR for first record
    OPEN @PhotosCursor 
    FETCH NEXT FROM @PhotosCursor 
    INTO @PhotoName, @BaseURL             

    WHILE @@FETCH_STATUS = 0 
    BEGIN
        SET @AllPhotos =  @AllPhotos + ',' +  @PhotoName                  
        FETCH NEXT FROM @PhotosCursor 
        INTO @PhotoName, @BaseURL
    END

    select @AllPhotos as "Img"

    CLOSE  @PhotosCursor 
    DEALLOCATE  @PhotosCursor 
    Go

预期结果会返回'1.jpg, 2.jpg, 3.jpg',但结果为NULL

2 个答案:

答案 0 :(得分:1)

在不使用游标的情况下,有很多方法可以做到这一点。但是,如果您坚持保留现有代码,请先启动@AllPhotos。现在,它是NULL,无论你添加什么,仍然等同于NULL

DECLARE @AllPhotos nvarchar(MAX) = ''

答案 1 :(得分:0)

在字符串连接SET @AllPhotos = @AllPhotos + ',' + @PhotoName中,如果光标中的任何一个Photo_File_Name条目为NULL,则最终结果为NULL

将光标查询更改为以下内容将确保将NULL值作为空字符串返回。

-- Take all photos in Cursor
SET @PhotosCursor = CURSOR FAST_Forward For
 SELECT COALESCE([Photo_File_Name], '') AS Photo_File_Name,
        [Base_URL]
   FROM [ART].[dbo].[STR_FK_PropertyPhoto]
  WHERE PropId = @propId

但请注意,如果第三个'1.jpg,2.jpg,,4.jpg'Photo_File_Name,则现在会返回NULL之类的内容。

通过将SET包装在IF子句中

,可以轻松解决此问题
IF (@PhotoName <> '')
BEGIN
    SET @AllPhotos = @AllPhotos + ',' + @PhotoName
END