如何使用存储过程的返回值设置值

时间:2014-02-25 17:05:02

标签: sql sql-server

我有一个存储过程SP1,它接收一个参数@param1并用它做一堆事情并返回一个值。

现在我有一个由两列组成的表,比如C1和C2。最初,C1在每一行上具有不同的值,而C2在每一行上为0。现在我想用SP1返回的值更新C2,其对应的C1值为@param1。我希望有类似的东西:

update Table1 set C2 = (exec SP1 @param1=C1)

就像从大多数编程语言中的函数接收返回值一样。

我还没有学过任何SQL,但我做了很多研究,没有找到任何东西。所以任何帮助都会受到赞赏。

2 个答案:

答案 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