如何生成脚本而不是手动编写
if exists (select ... where id = 1)
insert ...
else
update ...
用很多记录来做这件事很无聊!
使用管理工作室生成脚本“仅数据”仅生成插入。因此,针对现有数据库运行它会在主键上产生错误。
如何生成脚本而不是手动编写
if exists (select ... where id = 1)
insert ...
else
update ...
用很多记录来做这件事很无聊!
使用管理工作室生成脚本“仅数据”仅生成插入。因此,针对现有数据库运行它会在主键上产生错误。
对于 SQL 2008 及更高版本,您可以开始使用Merge
语句以及CTE
典型 id/description 查找表的简单示例
WITH stuffToPopulate(Id, Description)
AS
(
SELECT 1, 'Foo'
UNION SELECT 2, 'Bar'
UNION SELECT 3, 'Baz'
)
MERGE Your.TableName AS target
USING stuffToPopulate as source
ON (target.Id = source.Id)
WHEN MATCHED THEN
UPDATE SET Description=source.Description
WHEN NOT MATCHED THEN
INSERT (Id, Description)
VALUES (source.Id, source.Description);
合并语句还有许多其他有用的功能(例如NOT MATCHED BY DESTINATION
, NOT MATCHED BY SOURCE
)。文档(上面链接)将为您提供更多信息。
MERGE 是最有效的方法之一。
但是,一开始编写 Merge 语句不是很直观,为多行或多表生成行是一个耗时的过程。
我建议使用其中一种工具来简化这一挑战:
我最近写了一篇关于这些工具的博客文章,以及利用 SSDT 部署数据数据库的方法。了解更多:
为 SSDT 项目中的数据库编写和部署数据脚本
我希望这会有所帮助。