変更/修正できないストアド プロシージャを使用する必要があります。少し複雑ですが、単純化して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 が my に挿入される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
パフォーマンスは最高ではないかもしれませんが、少なくとも動作します :-)。