删除数据并将数据插入数据库的最佳方法

时间:2015-02-01 18:31:39

标签: sql sql-server

所以我在sql server表中有一个目录,我需要每隔12小时刷新一次这个目录,这样做的正确方法是什么?

我一直在做一个简单的删除,然后是更新数据的批量复制,但我担心另一个进程正在使用这个表,可能会破坏一些东西。

干杯,

1 个答案:

答案 0 :(得分:0)

您可以使用MERGE功能。它在MS SQL Server 2008+中可用,并且还添加了try / catch - 事务处理。请尝试以下示例:

CREATE TABLE #Temp1 
(
     Id INT IDENTITY PRIMARY KEY
    ,Description NVARCHAR(20)
)

CREATE TABLE #Temp2
(
     Id INT IDENTITY PRIMARY KEY
    ,Description NVARCHAR(20)
)

INSERT INTO #Temp1 VALUES ('Example1'), ('Example2'), ('');
INSERT INTO #Temp2 VALUES ('Example1'), ('Example4'), ('Example5');

--First values:
SELECT Id, Description FROM dbo.#Temp1;
SELECT Id, Description FROM dbo.#Temp2;

BEGIN TRY
    BEGIN TRANSACTION;

    --MERGE statement:
    --#Temp1 will be our Target and #Temp2 our Source
    MERGE dbo.#Temp1 AS target
    USING (SELECT Id, Description FROM #Temp2) AS source
    ON (target.Id = source.Id)
    --When rows matched and description from Target will be '', then the delete will happen
    WHEN MATCHED AND target.Description = ''
        THEN DELETE 
    --When rows matched (by their Id, seen previously), then the update will happen:
    WHEN MATCHED 
        THEN UPDATE SET target.Description = source.Description 
    OUTPUT $action;

    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    RAISERROR('<<Transaction uncommited. Rolling back transaction',10,1);
    ROLLBACK TRANSACTION;
END CATCH

--Final values:
SELECT Id, Description FROM dbo.#Temp1;
SELECT Id, Description FROM dbo.#Temp2;

DROP TABLE #Temp1;
DROP TABLE #Temp2;