Sql-Server
多次復製表中具有唯一列的一組行
我希望復製表中的一組行,但在 SQL Server 17 中處理唯一列。該表是:
CREATE TABLE test1 ( id int CONSTRAINT PK_test1 PRIMARY KEY CLUSTERED IDENTITY, name nvarchar(10) CONSTRAINT UK_test1 UNIQUE NONCLUSTERED, value int, type varchar(20) );
表格內容為:
INSERT INTO test1 VALUES ('e_1',1,'A'); INSERT INTO test1 VALUES ('342A',34,'ABC'); INSERT INTO test1 VALUES ('Tame_33',277,'Test10');
現在我希望多次複製這些行,但問題在於 NAME 列是唯一的。到目前為止我所做的解決方案只是使用游標,但這效率低下,我很好奇這是否可以以更有效的方式完成?
DECLARE @id int; DECLARE @name nvarchar(20); DECLARE @value int; DECLARE @type varchar(10); DECLARE @cnt int = 0;stackoverflow DECLARE @intcnt int = 0; DECLARE temp_cursor CURSOR FOR SELECT * FROM test1 OPEN temp_cursor; FETCH NEXT FROM temp_cursor INTO @id,@name,@value,@type; WHILE @@FETCH_STATUS = 0 BEGIN WHILE @intcnt < 5 BEGIN INSERT INTO test1 VALUES ('ins_' + CONVERT(varchar,@intcnt) + '_' + CONVERT(varchar,@cnt), @value, @type); SET @intcnt = @intcnt + 1; END SET @intcnt = 0; FETCH NEXT FROM temp_cursor INTO @id,@name,@value,@type; SET @cnt = @cnt + 1; END CLOSE temp_cursor; DEALLOCATE temp_cursor;
WITH gen AS ( SELECT 1 AS num UNION ALL SELECT num+1 FROM gen WHERE num+1<=5 ) INSERT INTO test1 (name,value,type) SELECT 'ins_' + CONVERT(varchar,num) + '_' + CONVERT(varchar,id), value, type FROM gen CROSS JOIN test1
OP提供的一些解釋,添加以便其他人可以調整解決方案:
實際上使用 CTE 作為整數生成器(稱為“fnTally”),他後來在 CROSS JOIN 中使用它來生成這兩個表的笛卡爾積 - 源表是“test1”,由 CTE 生成,稱為“gen”(組合來自兩個表的每一行)。這裡唯一的進一步優化是使用 cCTE(Itzik Ben-Gan 引入的級聯 CTE)。