1

我必须使用存储过程 - 我无法更改/修改。虽然有点复杂,但可以简化为一个SELECT语句,即没有RETURNOUTPUT参数。出于本讨论的目的,假设它类似于:

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 被插入到我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

2

首先,创建一个临时表 ( #OutData),其定义与getImage.

然后,将您的EXEC ..声明更改为:

INSERT INTO #OutData  EXEC [mydatasource].[dbo].[getImage] @sku

对问题的回应:“是否可以将 Key/Row ID 插入到临时表中,这样我就不必在每次循环迭代后截断它?

首先,作为一般规则,您不应该TRUNCATE在#temp 表上使用,因为它存在一些模糊的锁定问题。如果您需要这样做,请DROP再次CREATE使用它们(无论如何它们都为此进行了优化)。

其次,您不能以任何方式修改存储过程返回的数据集。当然,一旦它在#temp 表中,你就可以用它做你想做的事。因此,您可以将 KeyId 列添加到#OutData. 然后在循环中创建第二个#temp 表(#TmpData),并使用INSERT..EXEC转储到该表中。然后INSERT..SELECT通过#OutData从中选择#TmpData,添加您的 KeyID 列。最后,DROP TABLE #TmpData作为循环中的最后一条语句。

这应该表现得相当好。

于 2013-07-09T15:20:27.000 回答
1

有时,完全在 SQL Server 内部执行代码可能比直接在客户端执行更困难,发送多个调用 SProc 的查询(理想情况下在一次往返中批处理)并在那里直接处理结果。

否则,如果您绝对不能修改被调用的过程,则 INSERT-EXEC 方法似乎更容易。有一些替代方法,都有一些额外的问题,如下所示:http: //www.sommarskog.se/share_data.html

于 2013-07-09T17:32:29.167 回答