gpt4 book ai didi

SQL Server 2008 是否有更有效的方法来执行此更新循环?

转载 作者:行者123 更新时间:2023-12-04 21:18:14 26 4
gpt4 key购买 nike

第一次发布问题,对于任何错误,我提前表示歉意。该表包含分配给团队的记录,初始分配是通过另一个流程完成的。通常,我们必须重新分配代理人的记录并将其平均分配给团队的其他成员。我们一直在手工做这件事,一个接一个,这很麻烦。所以我想出了这个解决方案:

    DECLARE @UpdtAgt TABLE (ID INT, Name varchar(25))
INSERT INTO @UpdtAgt
VALUES (1, 'Gandalf')
,(2,'Hank')
,(3,'Icarus')


CREATE TABLE #UpdtQry (TblID varchar(25))
INSERT INTO #UpdtQry
SELECT ShtID
FROM TestUpdate

DECLARE @RowID INT
DECLARE @AgtID INT
DECLARE @Agt varchar(25)
DECLARE @MaxID INT
SET @MaxID = (SELECT COUNT(*) FROM @UpdtAgt)
SET @AgtID = 1

--WHILE ((SELECT COUNT(*) FROM #UpdtQry) > 0)
WHILE EXISTS (SELECT TblID FROM #UpdtQry)

BEGIN
SET @RowID = (SELECT TOP 1 TblID FROM #UpdtQry)
SET @Agt = (SELECT Name FROM @UpdtAgt WHERE ID = @AgtID)

UPDATE TestUpdate
SET Assignment = @Agt
WHERE ShtID = @RowID

DELETE #UpdtQry WHERE TblID = @RowID

IF @AgtID < @MaxID
SET @AgtID = @AgtID + 1
ELSE
SET @AgtID = 1


END

DROP TABLE #UpdtQry

这真的是我第一次尝试做这么深入的事情。更新 100 行大约需要 30 秒。 UPDATE 表 TestUpdate 只有 CLUSTERED 索引。我怎样才能使它更有效率?

编辑:我在解释中没有很好地定义@UpdtAgt 和#UpdtQry 表。 @UpdtAgt 将保留正在重新分配记录的代理,并且可能会在每次使用时更改。 #UpdtQry 将有一个 WHERE 子句来定义哪些代理记录将被重新分配,同样,这将随着每次使用而改变。我希望这能让这更清楚一点。再次为第一次没有做对而道歉。

编辑 2:我注释掉了旧的 WHILE 子句并插入了 HABO 建议的那个。再次感谢 HABO。

最佳答案

我想这就是您要找的:

DECLARE @UpdtAgt TABLE 
(
ID INT,
Name VARCHAR(25)
)

INSERT @UpdtAgt
VALUES (1, 'Gandalf')
,(2, 'Hank')
,(3, 'Icarus')

UPDATE t
SET t.Assignment = a.Name
FROM TestUpdate AS t
INNER JOIN @UpdtAgt AS a
ON t.ShtID = a.ID

这应该一次完成所有 4 行。

附言...

如果您以后确实像在原始帖子中那样创建表格,请尽量使列和变量的命名与其用途保持一致!

在您的示例中,您使用了 IDAgtIDShtID 以及(最令人困惑的)TblID(以及我认为它们都是一样的东西?[如果我错了请纠正我!])。如果你在任何地方都称它为 AgtID(并且变量为 @AgtID [没有真正需要 @RowID])那么它会容易得多一目了然! AssignmentName 也是如此。

关于SQL Server 2008 是否有更有效的方法来执行此更新循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43529172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com