Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 如何使用存储过程的返回值设置值_Sql_Sql Server - Fatal编程技术网

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

Sql 如何使用存储过程的返回值设置值,sql,sql-server,Sql,Sql Server,我有一个存储过程SP1,它接收一个参数@param1并使用它执行一系列操作并返回一个值 现在我有一个由两列组成的表,比如C1和C2。最初,C1在每行上具有不同的值,而C2在每行上为0。现在我想用SP1返回的值更新C2,并将其相应的C1值更新为@param1。我希望是这样的: update Table1 set C2 = (exec SP1 @param1=C1) 就像在大多数编程语言中从函数接收返回值一样 我还没有学过SQL,但是我做了很多研究,没有发现任何东西。因此,任何帮助都将不胜感激。您

我有一个存储过程SP1,它接收一个参数@param1并使用它执行一系列操作并返回一个值

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

update Table1 set C2 = (exec SP1 @param1=C1)
就像在大多数编程语言中从函数接收返回值一样


我还没有学过SQL,但是我做了很多研究,没有发现任何东西。因此,任何帮助都将不胜感激。

您不能使用这样的存储过程

您需要做的是将存储过程代码移动到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语句中使用该参数。像这样的

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

您能将表更新直接添加到存储过程中吗?@tkendrick20,即使我不知道该怎么做。由于我需要分别更新每一行,如何选择每一行并调用存储过程?在所有行上循环?如果我错了,请纠正我,从存储过程返回的值是单个值,并且要在表1中更新哪些行??或者,是否要使用存储过程返回的值更新所有行的C2列??根据SP执行的“一堆事情”的复杂性,您可能只需要将SP合并到更新中,或者将更新合并到SP@M.Ali是的,所有的行。但是SP返回的值取决于该行上C1的值。因此,每行的返回值将不同。这不会满足他的要求。他需要一个基于C1字段值的值。是的,这将对每一行应用相同的值,不是吗?update table命令不是为每一行执行SP,而是动态的,它为每一行计算C1。@Xufeng您能展示完整的update语句吗。因为你在你的问题上想做的我已经做到了。现在,如果您的问题扩大,您需要提供更多信息。@M.Ali这是完整的更新声明。但是这条语句更新了表中的所有行。您不能在UDF中执行存储过程。它说FN1的声明必须自己在一个批处理中。所以我在另一个文件中创建了它,现在如何调用它?它说FN1并没有建成-in@Xufeng,在另一个请求中执行CREATE函数代码(别忘了查看我编辑的答案)。在这之后,您将能够在任何查询中使用它。@Crono所以UDF中不能有任何exec?但是原始SP1执行其他存储过程。。这是公司代码,所以很混乱…:(.有什么解决方法吗?你可以在函数中使用OPENROWSET。它很粗糙而且性能不好,但它可能会帮你完成这项工作。
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
-- 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