2017-08-10 89 views
1

已存在我有一個表中的主數據庫稱爲ERTdata其中存儲的數據庫名稱,我在這個數據庫中的列Id, DatabaseName, Initiatedby, CreatedDate後。SQL - 插入到表格如果sys.databases中

我有列Id, DatabaseName, Initiatedby, CreatedDate稱爲DatabasesOnServer另一個表。

這是我的查詢:

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

的問題是它會導致重複。我們如何才能插入它,只要它不存在,並且數據庫不存在於服務器上從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; 
+0

你好lad2025,查詢工作。但是,如果數據庫被刪除,如何從DatabaseOnServer刪除記錄。 示例:我有一個名爲ABC的數據庫,名稱和詳細信息被插入到DatabaseOnServer上。我從服務器刪除ABC,並且該條目仍存在於DatabaseOnServer中。該記錄應被刪除 – Tango

+1

@Tango這應該是全新的問題。如果你需要更多的邏輯使用'MERGE'。 – lad2025

+0

@Tango請不要以這種方式改變問題。如果您的原始問題已解決,請將其標記爲已接受並提出新問題。 – lad2025