Sql server SSMS/TSQL-为查询中找到的每个记录插入多个记录

Sql server SSMS/TSQL-为查询中找到的每个记录插入多个记录,sql-server,tsql,ssms-2016,Sql Server,Tsql,Ssms 2016,我想为符合特定查询条件的每条记录插入多条记录(具体为两条),其中第1列(在创建的两条记录中)具有唯一ID。insert的其余值应从查询中的相应列中提取。在第一次插入中,列2将是列1中的原始值,在第二次插入中,列2将是列2中的原始值 理想情况下,我追求的是: FIND RECORDS THAT MEETS CRITERIA FOR EACH RECORD GENERATE GUID INSERT TWO NEW RECORDS WITH GUID AS COLUMN1, AND REMAINING

我想为符合特定查询条件的每条记录插入多条记录(具体为两条),其中第1列(在创建的两条记录中)具有唯一ID。insert的其余值应从查询中的相应列中提取。在第一次插入中,列2将是列1中的原始值,在第二次插入中,列2将是列2中的原始值

理想情况下,我追求的是:

FIND RECORDS THAT MEETS CRITERIA
FOR EACH RECORD
GENERATE GUID
INSERT TWO NEW RECORDS WITH GUID AS COLUMN1, AND REMAINING COULMNS FROM 
CURRENT RECORD FOUND

RECORDS
123 abc 3 4 5
456 def 6 7 8

RECORD 1
123 abc 3 4 5

NEW RECORDS AFTER INSERTS
UID1 123 3 4 5
UID1 abc 3 4 5

ROW 2
456 def 6 7 8

NEW RECORDS AFTER INSERTS
UID2 456 6 7 8
UID2 def 6 7 8
下面的INSERT-SELECT-FROM正好处理了我想要做的事情,但只针对每个找到的记录执行一次插入

INSERT INTO table1
( 
    Column1,
    Column2,
    Column3
    Column4
    Column5
)
SELECT
    NEWID(), -- unique ID
    Column2, -- or Column1 based on which insert we are doing
    Column3, -- always column 3
    Column4, --always column 4
    Column5 -- always column 5
FROM
    table1
WHERE Column1 IS NOT NULL
AND Column1 != Column4

有没有一种简单的方法可以通过TSQL实现这一点?我需要它批量运行,因为可能有数千条记录满足查询条件。

这里有一种可能性。首先使用生成第一组行的查询,并将它们插入临时表中

WITH xQ(UUID,Column2,Column3,Column4,Column5) AS 
( 
    SELECT
        NEWID(),
        Column1,
        Column2,
        Column3,
        Column4,
        Column5 
    FROM
        table1
    WHERE Column1 IS NOT NULL
    AND Column1 != Column4
)

INSERT INTO table1
( 
    Column1,
    Column2,
    Column3,
    Column4,
    Column5
)
SELECT
    UUId, 
    Column1,
    Column3,
    Column4,
    Column5 
FROM xQ
UNION
SELECT
    UUId,
    Column2,
    Column3,
    Column4,
    Column5 
FROM xQ

SELECT 
    NEWID() AS [uid], -- unique ID
    column1,
    Column2, -- or Column1 based on which insert we are doing
    Column3, -- always column 3
    Column4, --always column 4
    Column5 -- always column 5
INTO #temp
FROM
    table1
WHERE Column1 IS NOT NULL
AND Column1 != Column4
现在,使用该临时表,我们可以对同一个表进行
联合
,以生成第二组行并将它们插入表1

INSERT INTO table1
SELECT 
    [uid] AS Column1
  , CAST(column1 AS NVARCHAR(3)) AS Column2
  , column3 
  , column4
  , column5
FROM #temp
UNION ALL
SELECT 
    [uid] AS Column1
  , column2
  , column3 
  , column4
  , column5
FROM #temp
ORDER BY Column1

DROP TABLE #temp

是否希望每对行具有相同的
NEWID
?是,创建的每对记录都具有相同的生成ID。这里的目标是将初始数据拆分为两个记录,并使用生成的ID将这两个记录链接在一起。这似乎为插入的每个记录生成一个UUID。我想我应该澄清一下,这实际上只是插入的每套记录的“唯一性”。两个插入都有一个UUID。否则它就完成了我的目标。你能给我解释一下with xQ语句是什么吗?我进行了快速搜索,但找不到任何相关文档。我在sql server中使用CTE(公共表表达式)为每个按条件返回的记录生成唯一ID,然后使用此结果两次