SQL Server在更新语句中执行存储过程

4

每次更新记录时,必须使用一个过程来获得不同的值。该过程返回单个整数值。

declare @value int;
exec @value = get_proc param;
update table1 set field1 = @value;

这段代码只适用于一个记录,但我希望该过程能为每个记录获取新值。

没有更多的信息很难说。存储过程如何确定每一行适当的值?根据存储过程的功能,可能可以创建一个表值函数,并加入其中。 - Aaron Bertrand
它通过某种算法返回序列号以用于特定目的,当更新每个记录时必须有新的序列号。 - Alaa Jabre
1
如果您可以在一个表值函数中执行那个逻辑,那将是最好的方法。table1中确定@value的列是哪一列? - Aaron Bertrand
我想我会像你建议的那样使用一个函数,谢谢。 - Alaa Jabre
我已经添加了一个例子。当然我无法提供更具体的信息,因为我不知道这个过程是做什么的,但愿这可以帮助你入门。 - Aaron Bertrand
你能展示你的存储过程吗?如果你可以一次处理多行数据,那么相较于逐行执行逻辑,性能将会更加卓越。 - ErikE
2个回答

2

以下是如何使用表值函数来执行此类型的更新的快速示例:

USE tempdb;
GO

CREATE TABLE dbo.Table1(ID INT, Column1 INT);

INSERT dbo.Table1(ID)
    SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3;
GO

CREATE FUNCTION dbo.CalculateNewValue
(@ID INT)
RETURNS TABLE
AS
    -- no idea what this logic would be,
    -- just showing an example

    RETURN(SELECT NewValue = @ID + 1);
GO

SELECT t1.ID, n.NewValue
    FROM dbo.Table1 AS t1 
    CROSS APPLY dbo.CalculateNewValue(t1.ID) AS n;

结果:

ID NewValue
-- --------
 1        2
 2        3
 3        4

现在有一个使用相同信息的更新:
UPDATE t1 SET Column1 = n.NewValue
    FROM dbo.Table1 AS t1 
    CROSS APPLY dbo.CalculateNewValue(t1.ID) AS n;

SELECT ID, Column1 FROM dbo.Table1;

结果:

ID Column1
-- -------
 1       2
 2       3
 3       4

你做的这个东西真的很棒,几乎和我到目前为止所做的一样。非常感谢你 :) - Alaa Jabre

0

真的需要是一个过程吗?如果您可以将get_proc实现为函数,则可以将其应用于所需的每个记录;)

此外,您使用value1是用来做什么的?在您提供的示例中,它是不必要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接