Sql-Server

多次復製表中具有唯一列的一組行

  • November 11, 2020

我希望復製表中的一組行,但在 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)。

引用自:https://dba.stackexchange.com/questions/279075