我试图使用以下存储过程从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
。
答案 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