首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有"Script table as - MERGE“功能?

有没有"Script table as - MERGE“功能?
EN

Stack Overflow用户
提问于 2011-03-09 08:11:31
回答 2查看 548关注 0票数 5

在SSMS2008 R2中,当我右击一个表时,我看到"Script table as“,然后是插入和更新选项。但是Merge呢?Merge实际上就是这两者中的一部分。

有没有什么工具可以添加这个选项?(因此,我可以编写一条merge语句脚本,以便添加源信息(类似于Insert和Update脚本,可以添加要插入或更新的数据)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-13 05:22:52

SSMS中没有执行此类操作的内置功能(我猜使用外部插件可能是可能的)。

有一个由Michał Gołoś编写的过程sp_GenMerge(在麻省理工学院许可下获得许可),它允许将包含数据的表编写为merge语句。

示例场景:

代码语言:javascript
复制
CREATE TABLE [Customer]  (
   ID                   INT                  IDENTITY(1,1) CONSTRAINT PK_CUSTOMER PRIMARY KEY (ID),
   FIRSTNAME            NVARCHAR(30)         NOT NULL,
   LASTNAME             NVARCHAR(30)         NOT NULL,
   CITY                 NVARCHAR(30)         NULL,
   COUNTRY              NVARCHAR(30)         NULL,
   PHONE                NVARCHAR(20)         NULL
);

INSERT INTO [Customer] ([FirstName],[LastName],[City],[Country],[Phone])
VALUES('John','Smith','Berlin','Germany','12345'),('Cathrine','Fa','Brasilia','Brasil','(3) 4324-4723');

基本SP呼叫(支持更多选项-参见文档):

代码语言:javascript
复制
EXEC sp_GenMerge @source_table = 'dbo.Customer';

输出:

代码语言:javascript
复制
DECLARE @xml XML = N'
<!-- Insert the generated data here -->
';


MERGE INTO dbo.Customer AS Target
USING (SELECT x.value('(@ID)', 'int') AS [ID]
            , x.value('(@FIRSTNAME)', 'nvarchar(30)') AS [FIRSTNAME]
            , x.value('(@LASTNAME)', 'nvarchar(30)') AS [LASTNAME]
            , x.value('(@CITY)', 'nvarchar(30)') AS [CITY]
            , x.value('(@COUNTRY)', 'nvarchar(30)') AS [COUNTRY]
            , x.value('(@PHONE)', 'nvarchar(20)') AS [PHONE]
        FROM @xml.nodes('v') AS t(x)) AS Source ([ID], [FIRSTNAME], [LASTNAME], [CITY], [COUNTRY], [PHONE])
  ON (Target.[ID] = Source.[ID])
WHEN NOT MATCHED BY TARGET
THEN INSERT([FIRSTNAME]
          , [LASTNAME]
          , [CITY]
          , [COUNTRY]
          , [PHONE])
     VALUES(Source.[FIRSTNAME]
          , Source.[LASTNAME]
          , Source.[CITY]
          , Source.[COUNTRY]
          , Source.[PHONE])
WHEN MATCHED AND EXISTS (SELECT Target.[FIRSTNAME]
                              , Target.[LASTNAME]
                              , Target.[CITY]
                              , Target.[COUNTRY]
                              , Target.[PHONE]
                         EXCEPT
                         SELECT Source.[FIRSTNAME]
                              , Source.[LASTNAME]
                              , Source.[CITY]
                              , Source.[COUNTRY]
                              , Source.[PHONE])
THEN UPDATE SET Target.[FIRSTNAME] = Source.[FIRSTNAME]
              , Target.[LASTNAME] = Source.[LASTNAME]
              , Target.[CITY] = Source.[CITY]
              , Target.[COUNTRY] = Source.[COUNTRY]
              , Target.[PHONE] = Source.[PHONE];
GO

并将脚本行作为XML有效负载:

代码语言:javascript
复制
<v ID="1" FIRSTNAME="John" LASTNAME="Smith" CITY="Berlin" COUNTRY="Germany" PHONE="12345" />
<v ID="2" FIRSTNAME="Cathrine" LASTNAME="Fa" CITY="Brasilia" COUNTRY="Brasil" PHONE="(3) 4324-4723" />
票数 5
EN

Stack Overflow用户

发布于 2011-03-27 13:02:20

直到我知道你不能但这里有一些小贴士:

How to edit SSMS Script Table As templates?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5239944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档