我有一个主数据库,其中有一个名为ERTdata
的表,其中存储了数据库的名称,我在此数据库中的列Id, DatabaseName, Initiatedby, CreatedDate
之后。
我有另一个名为DatabasesOnServer
的表,列Id, DatabaseName, Initiatedby, CreatedDate
。
这是我的疑问:
INSERT INTO DatabaseOnServer (Id, DatabaseName, Initiatedby,CreatedDate)
SELECT Id, DatabaseName, Initiatedby, CreatedDate
FROM ERTdata
WHERE EXISTS (SELECT 1
FROM sys.databases
WHERE name = ERTdata.DatabaseName)
上面的查询检查服务器上是否已经有特定的数据库,如果ERTdata中存在相同的数据库,它会插入到DatabaseOnServer表中。
问题是它会导致重复。我们如何才能插入它,只有当它不存在且服务器上没有数据库时才从DatabaseOnServer
中删除该条目。
提前致谢。
答案 0 :(得分:1)
问题是它会导致重复。我们如何才能插入它,只有当它不存在且服务器上没有数据库时才从DatabaseOnServer中删除该条目。
您可以简单地使用EXCEPT
:
INSERT INTO DatabaseOnServer (Id, DatabaseName, Initiatedby,CreatedDate)
SELECT Id, DatabaseName, Initiatedby, CreatedDate
FROM ERTdata
WHERE EXISTS (SELECT 1
FROM sys.databases
WHERE name = ERTdata.DatabaseName)
EXCEPT
SELECT Id, DatabaseName, Initiatedby, CreatedDate
FROM DatabaseOnServer;
修改强>
但是,如果数据库被删除,如何从DatabaseOnServer中删除记录。示例:我有一个名为ABC的数据库,名称和详细信息将插入DatabaseOnServer。我从服务器上删除了ABC,并且该条目仍然存在于DatabaseOnServer中。记录应该删除
MERGE DatabaseOnServer AS trg
USING (SELECT Id, DatabaseName, Initiatedby, CreatedDate
FROM ERTdata
WHERE EXISTS (SELECT 1
FROM sys.databases
WHERE name = ERTdata.DatabaseName)) AS src
ON trg.Id = src.id AND trg.DatabaseName = src.Name
WHEN NOT MATCHED BY TARGET THEN
INSERT (Id, DatabaseName, Initiatedby, CreatedDate )
VALUES (Id, DatabaseName, Initiatedby, CreatedDate )
WHEN NOT MATCHED BY SOURCE THEN
DELETE;