Vac*_*ano 8 sql-server scripting ssms sql-server-2008 sql-merge
在 SSMS 2008 R2 中,当我右键单击表时,我会看到“脚本表为”,然后是插入和更新选项。但是合并呢?合并实际上就是将这两者结合在一起。
我可以获得任何可以添加该选项的工具吗?(因此,我可以编写一个合并语句,准备好添加源信息(有点像插入和更新脚本已准备好添加要插入或更新的数据)。
SSMS 中没有执行此类操作的内置功能(我想通过外部插件可能可以实现)。
\n有一个由Micha\xc5\x82 Go\xc5\x82o\xc5\x9bsp_GenMerge编写的程序(根据 MIT 许可证授权),允许使用数据编写表脚本作为合并语句。
示例场景:
\nCREATE 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\');\nRun Code Online (Sandbox Code Playgroud)\n基本 SP 调用(它支持更多选项 - 请参阅文档):
\nEXEC sp_GenMerge @source_table = \'dbo.Customer\';\nRun Code Online (Sandbox Code Playgroud)\n输出:
\nDECLARE @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\nRun 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" />\nRun Code Online (Sandbox Code Playgroud)\n