SQL - 插入表如果sys.databases中存在

时间:2017-08-10 09:02:31

标签: sql sql-server tsql sql-server-2012

我有一个主数据库,其中有一个名为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中删除该条目。

提前致谢。

1 个答案:

答案 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;