Sql 删除数据并将其重新插入数据库的最佳方法
所以我在sql server表中有一个目录,我需要每12小时刷新一次这个目录,正确的方法是什么 我一直在做一个简单的删除,然后是更新数据的大容量拷贝,但我担心另一个进程正在使用这个表,可能会破坏某些东西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
干杯,您可以使用合并功能。它在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有适当的算法来处理这种冲突。