Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从存储过程中获取/使用Select值_Sql_Sql Server_Sql Server 2008_Stored Procedures - Fatal编程技术网

Sql 从存储过程中获取/使用Select值

Sql 从存储过程中获取/使用Select值,sql,sql-server,sql-server-2008,stored-procedures,Sql,Sql Server,Sql Server 2008,Stored Procedures,我必须使用一个存储过程-我不能更改/修改它。虽然它有点复杂,但可以简化为SELECT语句,即没有返回或输出参数。在本次讨论中,假设如下: SELECT [URL] as imgPath FROM [mydatasource].[dbo].[DigitalContent] 我需要执行这个存储过程,传入表中每一行的行ID SKU。 我使用光标进行此操作,如下所示: DECLARE @sku varchar(100) DECLARE @imgPath varchar(500) DECLAR

我必须使用一个存储过程-我不能更改/修改它。虽然它有点复杂,但可以简化为SELECT语句,即没有返回或输出参数。在本次讨论中,假设如下:

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,即success。这导致0被插入到我的PROD_表中或转储到控制台上。但是,在执行getImage存储过程时,它会将imgPath的正确值转储到控制台

如何获得正确的值,即上面循环中存储过程中的SELECT结果,以便正确更新PROD_表

答复 感谢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

性能可能不是最好的,但至少可以工作:-。

首先,创建一个临时表OutData,其定义与getImage返回的输出数据集匹配

然后,更换你的主管。。对此的声明:

INSERT INTO #OutData  EXEC [mydatasource].[dbo].[getImage] @sku
对以下问题的回答:是否可以将键/行ID插入临时表中,这样我就不必在每次循环迭代后截断它

首先,作为一般规则,您不应该在临时表上使用TRUNCATE,因为它存在一些模糊的锁定问题。如果您需要这样做,只需删除并再次创建它们,它们已经为此进行了优化

其次,不能以任何方式修改存储过程返回的数据集。当然,一旦它出现在临时表中,你就可以用它做你想做的事情。因此,您可以向OutData添加一个KeyId列。然后在循环内部生成第二个临时表TmpData,并使用INSERT..EXEC转储到该表中。然后插入..通过从TmpData中选择并添加您的KeyID列来选择OutData。最后,删除表TmpData作为循环中的最后一条语句


这应该表现得相当好。

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


否则,如果绝对不能修改被调用的过程,INSERT-EXEC方法似乎更容易。这里有一些替代方法,但都有一些附加问题:

再次感谢Reband先生!我不想为此填充一个表变量,但这似乎是唯一的选择:-谢谢你。我讨厌每次运行循环时都填充表变量。我的存储过程只返回imgPath,即没有键,我无法修改它。是否可以将键/行ID插入临时表中,这样我就不必在每次循环迭代后截断它。谢谢你。这对我很管用。我只使用了一个临时表(在循环中创建和删除)来存储存储过程的结果。