我有一个存储过程SP1,它接收一个参数@param1并用它做一堆事情并返回一个值。
现在我有一个由两列组成的表,比如C1和C2。最初,C1在每一行上具有不同的值,而C2在每一行上为0。现在我想用SP1返回的值更新C2,其对应的C1值为@param1。我希望有类似的东西:
update Table1 set C2 = (exec SP1 @param1=C1)
就像从大多数编程语言中的函数接收返回值一样。
我还没有学过任何SQL,但我做了很多研究,没有找到任何东西。所以任何帮助都会受到赞赏。
答案 0 :(得分:1)
在存储过程中创建一个OUTPUT
参数,并使用该参数存储该值,然后在Update语句中使用该参数。像这样......
DECLARE @OutParam Datatype;
EXECUTE SP1 @param1=C1, @OUT_Param = @OutParam OUTPUT --<--
--Now you can use this OUTPUT parameter in your Update statement.
UPDATE Table1
SET C2 = @OutParam
<强>更新强>
在阅读完您的评论之后,我认为您正在尝试将C1表的值从表Table1传递到存储过程,然后使用存储过程的返回值更新Table1的相关C2列。
这种最佳方法是创建表类型参数并将C1的值作为表传递。 See here
有关如何将表传递给存储过程的详细解答。
我没有测试过但是在这种情况下我想你可以做这样的事情..如果你有一张大桌子,我不推荐这种方法。在这种情况下,最好使用表类型参数Procedure。
-- Get C1 Values In a Temp Table
SELECT DISTINCT C1 INTO #temp
FROM Table1
-- Declare Two Varibles
--1) Return Type of Stored Procedure
--2) Datatype of C1
DECLARE @C1_Var DataType;
DECLARE @param1 DataType;
WHILE EXISTS(SELECT * FROM #temp)
BEGIN
-- Select Top 1 C1 to @C1_Var
SELECT TOP 1 @C1_Var = C1 FROM #temp
--Execute Proc and returned Value in @param1
EXECUTE SP1 @param1 = @C1_Var
-- Update the table
UPDATE Table1
SET C2 = @param1
WHERE C1 = @C1_Var
-- Delete from Temp Table to entually exit the loop
DELETE FROM #temp WHERE C1 = @Var
END
答案 1 :(得分:-2)
你不能使用那样的存储过程。
您需要做的是将存储过程代码移动到UDF函数中:
CREATE FUNCTION FN1 (@funcParam1 <param type>)
RETURNS <return type>
AS
BEGIN
DECLARE @return <return type>;
-- Do whatever you have to do here
RETURN @return;
END
从那时起你可以这样做:
UPDATE Table1 SET C2 = FN1(C1)
请注意,如果功能不确定,这种做法可能会对性能造成不良影响。有关详细信息,请参阅deterministic and non-deterministic functions。