我必须使用存储过程 - 我无法更改/修改。虽然有点复杂,但可以简化为一个SELECT
语句,即没有RETURN
或OUTPUT
参数。出于本讨论的目的,假设它类似于:
SELECT [URL] as imgPath
FROM [mydatasource].[dbo].[DigitalContent]
我需要执行这个存储过程,传入表中每一行的行 ID (SKU)。我为此使用光标,如下所示:
DECLARE @sku varchar(100)
DECLARE @imgPath varchar(500)
DECLARE c CURSOR FOR
SELECT [SKU]
FROM [mydatasource].[dbo].[PROD_TABLE]
OPEN c
FETCH NEXT FROM c INTO @sku
WHILE @@FETCH_STATUS = 0 BEGIN
EXEC @imgPath = [mydatasource].[dbo].[getImage] @sku
--UPDATE PROD_TABLE SET ImgPath=@imgPath WHERE SKU=@sku
SELECT @imgPath AS ImgPath
FETCH NEXT FROM c INTO @sku
END
CLOSE c
DEALLOCATE c
不幸的是,返回值@imgPath
返回0
即成功。这会导致0
s 被插入到我PROD_TABLE
的控制台中或转储到控制台上。但是,当getImage
存储过程执行时,它会将正确的值转储imgPath
到控制台。
如何在上面的循环中获得这个正确的值(即SELECT
存储过程中的结果),以便我可以正确更新我的PROD_TABLE
?
回答
感谢RBarryYoung 的建议,我的最终代码如下所示:
DECLARE @sku varchar(100)
DECLARE @imgPath varchar(500)
DECLARE c CURSOR FOR
SELECT [SKU]
FROM [mydatasource].[dbo].[PROD_TABLE]
OPEN c
FETCH NEXT FROM c INTO @sku
WHILE @@FETCH_STATUS = 0 BEGIN
CREATE TABLE #OutData ( imgPath varchar(500) )
INSERT INTO #OutData EXEC [mydatasource].[dbo].[getImage] @sku
--UPDATE PROD_TABLE SET ImgPath=(SELECT * FROM #OutData) WHERE SKU=@sku
SELECT * FROM #OutData
DROP TABLE #OutData
FETCH NEXT FROM c INTO @sku
END
CLOSE c
DEALLOCATE c
性能可能不是最好的,但至少它有效:-)。