MERGE INSERT来源。*

时间:2017-07-03 00:03:02

标签: sql-server merge implicit-conversion

目前我们有一个用于升级配置设置的SQL脚本。

MERGE [dbo].[ConfigurationSetting] AS Target
USING (SELECT * FROM (VALUES 
    -- <Snip> Hard-coded rows.
) AS s([Id], [Key], [DisplayName], [Value])) AS Source
    ON Target.[Id] = Source.[Id]
WHEN MATCHED THEN
    UPDATE SET
        [Key] = Source.[Key],
        [DisplayName] = Source.[DisplayName]
        -- Preserve existing [Value]
WHEN NOT MATCHED BY TARGET THEN 
    INSERT ([Id], [Key], [DisplayName], [Value])
    VALUES (Source.[Id], Source.[Key], Source.[DisplayName], Source.[Value])
WHEN NOT MATCHED BY SOURCE THEN
    DELETE
;

这很好用,但仅仅是因为我对简单的渴望,是否有一种语法可以简化 INSERT ... VALUES ...条约类似于INSERT VALUES Source.*

的内容

1 个答案:

答案 0 :(得分:0)

你对简约的看法实际上是荒谬的。 从性能的角度来看,使用" * "本身就是个坏主意。

其次假设明天的表格设计被改变了计算列或默认值,然后INSERT VALUES Source。*可能根本不起作用或者可能给出错误的结果。

最重要的是,这是不可能的。

或者您可以删除合并并使用单独的插入和更新。然后您可以执行您想要的操作