Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 删除数据并将其重新插入数据库的最佳方法_Sql_Sql Server - Fatal编程技术网

Sql 删除数据并将其重新插入数据库的最佳方法

Sql 删除数据并将其重新插入数据库的最佳方法,sql,sql-server,Sql,Sql Server,所以我在sql server表中有一个目录,我需要每12小时刷新一次这个目录,正确的方法是什么 我一直在做一个简单的删除,然后是更新数据的大容量拷贝,但我担心另一个进程正在使用这个表,可能会破坏某些东西 干杯,您可以使用合并功能。它在MS SQL Server 2008+中可用,并且还添加了一个try/catch-transaction处理。请尝试以下示例: CREATE TABLE #Temp1 ( Id INT IDENTITY PRIMARY KEY ,Descript

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

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


干杯,

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

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;

所有与SQL相关的查询都是通过排队系统逐一执行的,这样安全吗?我的意思是,我首先做一个删除的SLQ声明,然后我做了一个新的InfUL的抛出,如果中间调用了另一个进程,除非你在一个原子的单个事务中执行整个过程,否则有一个风险,即数据用户可以检索部分更新的数据。考虑将数据加载到分级结构中,然后在使用SPE重命名或交换机进行竞争时交换新数据。对于倾倒,数据库管理系统将在执行的精确时间快照。绝对安全。DBMS有适当的算法来处理这种冲突。