【问题标题】:MERGE INSERT Source.*合并插入源。*
【发布时间】:2017-07-03 00:03:02
【问题描述】:

目前我们有一个用于更新配置设置的 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.*

【问题讨论】:

    标签: sql-server merge implicit-conversion


    【解决方案1】:

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

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

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

    或者你可以删除 Merge 并使用单独的 insert 和 update 。然后你可以做你想做的事

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 2012-06-30
      • 2012-08-09
      • 1970-01-01
      相关资源
      最近更新 更多