Sql 从存储过程中获取/使用Select值
我必须使用一个存储过程-我不能更改/修改它。虽然它有点复杂,但可以简化为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 [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插入临时表中,这样我就不必在每次循环迭代后截断它。谢谢你。这对我很管用。我只使用了一个临时表(在循环中创建和删除)来存储存储过程的结果。