我有一些带有一些数据的Temp_Table。根据Temp_Table中的数据,我将删除其他表中的相关行,然后将Temp-table中的所有数据插入table1。像下面的例子。
我可以用什么方式锁定Server2.Table1(我独占)并在放开锁定之前同时运行Delete和Insert语句?我不想要任何人在我执行删除/插入时读取或写入Table1。请注意,删除必须在 插入语句之前运行。
SSIS有办法做到这一点吗?或者我可以在开头使用Begin事务并在语句之后提交事务吗?我担心删除和插入都会在同一个事务中同时运行..
DELETE Table1
FROM Table1 t1
INNER JOIN (
SELECT Column2 FROM Temp_Table
GROUP BY Column2
) t2 ON t1.Column2 = t2.Column2
INSERT INTO Table1
SELECT (Column1, Column2...)
FROM Temp_Table
答案 0 :(得分:0)
您可以使用delete中的OUTPUT子句插入临时表
DELETE FROM dbo.table1
OUTPUT DELETED.* INTO @MyTable --or temp table
WHERE id = 10
在这种情况下,两个操作都将在单个事务中进行..
答案 1 :(得分:0)
SteveRs的评论是正确的,交易中的插入和删除语句并未同时运行。在对非生产数据库进行一些测试后,我得到了以下结果:
BEGIN TRY
BEGIN TRAN T1;
DELETE Table1
FROM Table1 t1
INNER JOIN (
SELECT Column2 FROM Temp_Table
GROUP BY Column2
) t2 ON t1.Column2 = t2.Column2
INSERT INTO Table1 (Column 1, Column2...)
SELECT (Column1, Column2...)
FROM Temp_Table
COMMIT TRAN T1;
END TRY
BEGIN CATCH
ROLLBACK TRAN T1;
END CATCH
首先执行Delete语句,然后执行Insert语句。并且不会在声明之间发布独占锁。
答案 2 :(得分:0)
合并状态表也将起作用。
通过合并,您可以在单个查询中合并所有操作,包括插入,更新和删除。 该操作基于两个表和条件之间的比较 选择先更新然后插入。
答案 3 :(得分:-4)
我不是最好的SQL,但你可以删除其他用户的INSERT / UPDATE / DELETE权限,直到你完成。
REVOKE INSERT, UPDATE, DELETE ON Table1 FROM [username]
可能有更好的方法。
你也可以在删除时将插入放在触发器上,但这并不能保证其他任何事务都不会进入。