1

変更/修正できないストアド プロシージャを使用する必要があります。少し複雑ですが、単純化して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これにより、0s が 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

パフォーマンスは最高ではないかもしれませんが、少なくとも動作します :-)。

4

2 に答える 2

1

SQL Server 内でコードを完全に実行することは、クライアント側で直接実行するよりも困難な場合があり、SProc を呼び出す複数のクエリを送信し (理想的には 1 回のラウンドトリップでバッチ処理)、そこで結果を直接処理します。

それ以外の場合、呼び出されたプロシージャを絶対に変更できない場合は、INSERT-EXEC メソッドの方が簡単に思えます。ここに示すように、いくつかの代替方法がありますが、すべて追加の問題があります: http://www.sommarskog.se/share_data.html

于 2013-07-09T17:32:29.167 に答える