Sql server 我可以为一个SQL合并匹配条件执行更新和插入吗?

Sql server 我可以为一个SQL合并匹配条件执行更新和插入吗?,sql-server,merge,Sql Server,Merge,我正在为一个表编写一个merge语句,该表有一个int列用于位标志。其思想是,只要所有其他列相等,两个不同的标志就可以共享同一行。否则,每个标志将获得一个单独的行。一开始可以共享一行,但是源数据可以更改为需要单独一行的标志 这个查询是我需要执行的,但是我不能像写的那样同时进行更新和插入。有没有办法让这一切顺利进行?还是用别的方法来解决我的问题 DECLARE @flag int = 128; MERGE target_table USING ( select * from source_tabl

我正在为一个表编写一个merge语句,该表有一个int列用于位标志。其思想是,只要所有其他列相等,两个不同的标志就可以共享同一行。否则,每个标志将获得一个单独的行。一开始可以共享一行,但是源数据可以更改为需要单独一行的标志

这个查询是我需要执行的,但是我不能像写的那样同时进行更新和插入。有没有办法让这一切顺利进行?还是用别的方法来解决我的问题

DECLARE @flag int = 128;
MERGE target_table
USING ( select * from source_table ) as source_table
ON <key value>
WHEN MATCHED AND NOT <other values equal> 
     AND ( field1 & @flag ) != 0 AND field1 != @flag THEN

    UPDATE SET field1 = ( field1 & ~@flag )

    INSERT ( flagField, <columns> ) 
    VALUES ( @flag, <values> )

;

我认为最好的方法是将需要拆分的源行拆分为两行,一行是更新行,一行是插入行。我用交叉申请来做这件事。然后可以对其进行筛选,以便只有将被拆分的行具有插入行。然后添加联接条件,使插入行不匹配

请注意,关于将MERGE ON子句用作筛选器,会有一些警告,但我认为在本例中不会有问题,因为我将其用作联接条件,而不是筛选器条件

下面是我用于测试的脚本。它接受val2=0的行,并将它们拆分为两行

CREATE TABLE [dbo].[TestTable](
    [TestTableId] [int] IDENTITY(1,1) NOT NULL,
    [val1] [int] NOT NULL,
    [val2] [int] NOT NULL
)

GO

TRUNCATE TABLE TestTable
GO

INSERT INTO TestTable(val1, val2)
VALUES
    (1,0)
    ,(2,1)
    ,(2,2)
    ,(3,0)
GO


DECLARE @SplitTable TABLE (TestTableId INT, val1 INT)

INSERT INTO @SplitTable
SELECT
    TestTableId, val1
FROM
    TestTable
WHERE
    val2 = 0

SELECT * FROM @SplitTable

;
WITH SplitRows AS (
    SELECT
        *
    FROM
        @SplitTable
        CROSS APPLY (
            VALUES (1),(2)
        )AS Split (RowNum)
)
MERGE TestTable Trg
USING (SELECT * FROM SplitRows) AS Src
    ON Trg.TestTableId = Src.TestTableId
        AND Src.RowNum = 1
WHEN MATCHED
THEN UPDATE
SET
    val2 = 1
WHEN NOT MATCHED BY TARGET
THEN INSERT (
    val1
    ,val2
)
VALUES (
    Src.val1
    ,2
)
;

SELECT * FROM TestTable

您的merge语句语法需要认真注意。@M.Ali ok?这是一个粗略的例子。你想让我怎么办?这是一个相当粗糙的例子,没有关于目标表和源表合并条件的子句,你的update子句似乎有点不正常。发布您的实际尝试,这样人们就可以看到您与实际解决方案的差距,如果可能,还可以显示一些示例数据和所需的输出。@M.Ali我的实际查询非常庞大,包含了足够的识别信息,我不想发布。update和insert语句是我在这里关注的部分,它们代表了我实际正在做的事情。其他一切都只是为了作秀,可以忽略不计。