某处是否有“脚本表 - 合并”功能?

Vac*_*ano 8 sql-server scripting ssms sql-server-2008 sql-merge

在 SSMS 2008 R2 中,当我右键单击表时,我会看到“脚本表为”,然后是插入和更新选项。但是合并呢?合并实际上就是将这两者结合在一起。

我可以获得任何可以添加该选项的工具吗?(因此,我可以编写一个合并语句,准备好添加源信息(有点像插入和更新脚本已准备好添加要插入或更新的数据)。

Luk*_*zda 6

SSMS 中没有执行此类操作的内置功能(我想通过外部插件可能可以实现)。

\n

有一个由Micha\xc5\x82 Go\xc5\x82o\xc5\x9bsp_GenMerge编写的程序(根据 MIT 许可证授权),允许使用数据编写表脚本作为合并语句。

\n

示例场景:

\n
CREATE TABLE [Customer]  (\n   ID                   INT                  IDENTITY(1,1) CONSTRAINT PK_CUSTOMER PRIMARY KEY (ID),\n   FIRSTNAME            NVARCHAR(30)         NOT NULL,\n   LASTNAME             NVARCHAR(30)         NOT NULL,\n   CITY                 NVARCHAR(30)         NULL,\n   COUNTRY              NVARCHAR(30)         NULL,\n   PHONE                NVARCHAR(20)         NULL\n);\n\nINSERT INTO [Customer] ([FirstName],[LastName],[City],[Country],[Phone])\nVALUES(\'John\',\'Smith\',\'Berlin\',\'Germany\',\'12345\'),(\'Cathrine\',\'Fa\',\'Brasilia\',\'Brasil\',\'(3) 4324-4723\');\n
Run Code Online (Sandbox Code Playgroud)\n

基本 SP 调用(它支持更多选项 - 请参阅文档):

\n
EXEC sp_GenMerge @source_table = \'dbo.Customer\';\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
DECLARE @xml XML = N\'\n<!-- Insert the generated data here -->\n\';\n\n\nMERGE INTO dbo.Customer AS Target\nUSING (SELECT x.value(\'(@ID)\', \'int\') AS [ID]\n            , x.value(\'(@FIRSTNAME)\', \'nvarchar(30)\') AS [FIRSTNAME]\n            , x.value(\'(@LASTNAME)\', \'nvarchar(30)\') AS [LASTNAME]\n            , x.value(\'(@CITY)\', \'nvarchar(30)\') AS [CITY]\n            , x.value(\'(@COUNTRY)\', \'nvarchar(30)\') AS [COUNTRY]\n            , x.value(\'(@PHONE)\', \'nvarchar(20)\') AS [PHONE]\n        FROM @xml.nodes(\'v\') AS t(x)) AS Source ([ID], [FIRSTNAME], [LASTNAME], [CITY], [COUNTRY], [PHONE])\n  ON (Target.[ID] = Source.[ID])\nWHEN NOT MATCHED BY TARGET\nTHEN INSERT([FIRSTNAME]\n          , [LASTNAME]\n          , [CITY]\n          , [COUNTRY]\n          , [PHONE])\n     VALUES(Source.[FIRSTNAME]\n          , Source.[LASTNAME]\n          , Source.[CITY]\n          , Source.[COUNTRY]\n          , Source.[PHONE])\nWHEN MATCHED AND EXISTS (SELECT Target.[FIRSTNAME]\n                              , Target.[LASTNAME]\n                              , Target.[CITY]\n                              , Target.[COUNTRY]\n                              , Target.[PHONE]\n                         EXCEPT\n                         SELECT Source.[FIRSTNAME]\n                              , Source.[LASTNAME]\n                              , Source.[CITY]\n                              , Source.[COUNTRY]\n                              , Source.[PHONE])\nTHEN UPDATE SET Target.[FIRSTNAME] = Source.[FIRSTNAME]\n              , Target.[LASTNAME] = Source.[LASTNAME]\n              , Target.[CITY] = Source.[CITY]\n              , Target.[COUNTRY] = Source.[COUNTRY]\n              , Target.[PHONE] = Source.[PHONE];\nGO\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
<v ID="1" FIRSTNAME="John" LASTNAME="Smith" CITY="Berlin" COUNTRY="Germany" PHONE="12345" />\n<v ID="2" FIRSTNAME="Cathrine" LASTNAME="Fa" CITY="Brasilia" COUNTRY="Brasil" PHONE="(3) 4324-4723" />\n
Run Code Online (Sandbox Code Playgroud)\n