复制行并增加 Version-Column without Cursor / Loop
Copy rows and increase Version-Column without Cursor / Loop
我有一个 table 这种结构:
ID Version Content
-------------------------------------------------------
1 1 sometext
1 2 anothertext
1 3 someverydifferenttext
因此所有行都具有相同的 ID 但版本不同。我想复制这些行(插入语句)并将 Version-Column 增加到下一个空闲数字。
预期结果:
ID Version Content
-------------------------------------------------------
1 1 sometext
1 2 anothertext
1 3 someverydifferenttext
1 4 sometext
1 5 anothertext
1 6 someverydifferenttext
有没有办法在单个 Select-Insert 语句中完成此操作?
我试过...
Insert Into MyTable
SELECT ID
, MAX([Version])OVER(PARTITION BY ID ORDER BY [Version] DESC) + 1
,Content
FROM MyTable
但这不起作用,因为 MAX() 必须在每次单独插入一行后再次计算。我目前看到的唯一选择是循环。
我用T-SQL.
看来您可以使用 ROW_NUMBER
和窗口 MAX
:
INSERT INTO dbo.YourTable
SELECT ID,
ROW_NUMBER() OVER (ORDER BY Version) + MAX(Version) OVER () AS Version,
Content
FROM dbo.YourTable WITH (UPDLOCK, HOLDLOCK);
我有一个 table 这种结构:
ID Version Content
-------------------------------------------------------
1 1 sometext
1 2 anothertext
1 3 someverydifferenttext
因此所有行都具有相同的 ID 但版本不同。我想复制这些行(插入语句)并将 Version-Column 增加到下一个空闲数字。
预期结果:
ID Version Content
-------------------------------------------------------
1 1 sometext
1 2 anothertext
1 3 someverydifferenttext
1 4 sometext
1 5 anothertext
1 6 someverydifferenttext
有没有办法在单个 Select-Insert 语句中完成此操作?
我试过...
Insert Into MyTable
SELECT ID
, MAX([Version])OVER(PARTITION BY ID ORDER BY [Version] DESC) + 1
,Content
FROM MyTable
但这不起作用,因为 MAX() 必须在每次单独插入一行后再次计算。我目前看到的唯一选择是循环。
我用T-SQL.
看来您可以使用 ROW_NUMBER
和窗口 MAX
:
INSERT INTO dbo.YourTable
SELECT ID,
ROW_NUMBER() OVER (ORDER BY Version) + MAX(Version) OVER () AS Version,
Content
FROM dbo.YourTable WITH (UPDLOCK, HOLDLOCK);