gpt4 book ai didi

sql-server - 某处是否有 "Script table as - MERGE"函数?

转载 作者:行者123 更新时间:2023-12-02 00:34:26 25 4
gpt4 key购买 nike

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

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

最佳答案

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

有一个程序 sp_GenMerge (在 MIT 许可下获得许可)由 Michał Gołoś 编写,它允许将带有数据的表作为合并语句编写脚本。

示例场景:

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 调用(它支持更多选项 - 请参阅文档):
EXEC sp_GenMerge @source_table = 'dbo.Customer';

输出:
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 负载:
<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" />

关于sql-server - 某处是否有 "Script table as - MERGE"函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5239944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com