我有一个带表输入的存储过程。我想以某种方式循环遍历该表的行。我不确定你是如何在SQL中做这种事情的。
以下是我在伪SQL中尝试做的事情:
CREATE PROCEDURE RearrangePuzzles
ChangedPuzzles table(
OldDifficulty nvarchar(50),
OldIndex int,
NewDifficulty nvarchar(50),
NewIndex int
)
AS
FOREACH Row IN ChangedPuzzles
BEGIN
UPDATE Puzzles
SET Index = Row.NewIndex,
Difficulty = Row.NewDifficulty
WHERE Index = Row.OldIndex AND
Difficulty = Row.OldDifficulty
END
当然,这不是有效的SQL。如何在SQL中编写具有所需功能的查询?
答案 0 :(得分:4)
我认为通常最好在SQL中采用基于集合的方法,而不是程序化的逐行解决方案。我相信JOIN会适合你的情况:
UPDATE p
SET
Index = cp.NewIndex,
Difficulty = cp.NewDifficulty
FROM
Puzzles p JOIN
ChangedPuzzles cp ON cp.OldIndex = p.Index AND cp.OldDifficulty = p.Difficulty
答案 1 :(得分:1)
您可以通过“Update-From”查询来执行此操作:
UPDATE a
SET a.Index = b.NewIndex,
a.Difficulty = b.NewDifficulty
FROM Puzzles a
JOIN ChangedPuzzles b ON a.Index = b.OldIndex AND a.Difficulty = b.OldDifficulty
答案 2 :(得分:0)
你不能这样做:
UPDATE Puzzles
SET
Index = cp.NewIndex,
Difficulty = cp.NewDifficulty
FROM ChangedPuzzles cp
WHERE Index = cp.OldIndex
AND Difficulty = cp.OldDifficulty
(自从我进入SQL以来已经过了几个月,如果语法关闭就道歉了)
答案 3 :(得分:0)
我可能会遗漏一些东西,但是这不能实现吗?:
UPDATE Puzzles
SET Puzzles.[Index] = ChangesPuzzles.NewIndex,
Puzzles.Difficulty = ChangedPuzzles.NewDifficulty
FROM ChangedPuzzles
WHERE Puzzles.[Index] = ChangedPuzzles.OldIndex AND Puzzles.Difficulty = ChangesPuzzles.OldDifficulty
答案 4 :(得分:0)
您可以使用table-valued parameters(SQL Server 2008中的新增功能):
CREATE TYPE dbo.ChangedPuzzles AS TABLE
(
OldDifficulty NVARCHAR(50) NOT NULL,
OldIndex INT NOT NULL,
NewDifficulty NVARCHAR(50) NOT NULL,
NewIndex INT NOT NULL,
PRIMARY KEY(OldIndex, OldDifficulty)
);
GO
CREATE PROCEDURE dbo.RearrangePuzzles
@Source dbo.ChangedPuzzles READONLY
AS
UPDATE Puzzles
SET Index = src.NewIndex,
Difficulty = src.NewDifficulty
FROM Puzzles p
INNER JOIN @Source src ON p.Index = src.OldIndex
AND p.Difficulty = src.OldDifficulty;
GO
--Test
DECLARE @p dbo.ChangedPuzzles;
INSERT @p VALUES (10,1,11,11), (20,2,22,12);
EXECUTE dbo.RearrangePuzzles @p;