Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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/blackberry/2.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 级联复制和merge语句导致锁问题_Sql_Sql Server_Database_Tsql_Merge - Fatal编程技术网

Sql 级联复制和merge语句导致锁问题

Sql 级联复制和merge语句导致锁问题,sql,sql-server,database,tsql,merge,Sql,Sql Server,Database,Tsql,Merge,使用MERGE时,出现以下错误: SQL Server数据库引擎的实例此时无法获取锁资源。当活动用户较少时,重新运行语句。请让数据库管理员检查此实例的锁和内存配置,或检查长时间运行的事务 太多的开发人员正在经历合并的持续问题,那么我们如何才能有效地为父/子表执行行和相关行的级联复制呢。例如,tableA有许多tableB行,tableC有许多tableD行等 MERGE在创建新标识值时非常有用,而在同一行上保留旧标识以查看下一次表插入时的数据,是否有其他方法 使用单表插入OUTPUT命令,我们无

使用
MERGE
时,出现以下错误:

SQL Server数据库引擎的实例此时无法获取锁资源。当活动用户较少时,重新运行语句。请让数据库管理员检查此实例的锁和内存配置,或检查长时间运行的事务

太多的开发人员正在经历合并的持续问题,那么我们如何才能有效地为父/子表执行行和相关行的级联复制呢。例如,tableA有许多tableB行,tableC有许多tableD行等

MERGE
在创建新标识值时非常有用,而在同一行上保留旧标识以查看下一次表插入时的数据,是否有其他方法

使用单表插入
OUTPUT
命令,我们无法同时获取旧ID和新ID

SQL Server 2012 (SP1) with 64GB ram using 50GB for max server memory
sp_configure 'locks' = 0
trace flags 1211 & 1224 are off
using READ_COMMITTED
SET LOCK_TIMEOUT 0

在SQL Server中执行此操作的最佳选项是什么?

我最近不得不重新查看此代码以进行更改,我所做的是:
code
(1)创建表#tmptable([oldID][bigint],[newID][bigint]),(2)将oldID永久列添加到主表中,这与该行的主键完全相同(3)插入[dbo]。[main table]输出插入。[oldID],插入。[newID]到#tmptable
选择oldID、column1、column2
code
-这是将新ID和旧ID插入的数据放在同一行的唯一方法,我很惊讶msft在sql中还没有这个命令,因为合并速度非常慢

序列化隔离级别是否有帮助?已经在使用READ COMMITTED而不是help,使用MERGE搜索网络存在太多问题,使用事务变得更加丑陋,解决方法是使用我发现的一个简洁的hack:tableA创建一个sourceID字段,然后执行:INSERT INTO tableA(col1,col2,col3,sourceID)输出inserted.[col1],inserted.[col2],inserted.col3,inserted.[currentID]插入到#t可选项中选择col1、col2、col3、currentID作为源ID。这样,在插入完成后,您可以在同一行上获得新的和旧的ID,希望这对其他人有所帮助。使用查询提示(例如forceseek和筛选的cte)或合并的视图目标也没有帮助-如果不坐下来思考这个问题,我不知道如何编写此代码。您可能比我有更多的技能。我想到的是某种递归cte解决方案,您可以使用@@SCOPE\u标识或的适当风格来种子化递归。尽管我不敢建议,光标是你的选择吗?我认为这很有效。你能澄清一下你所说的“旧身份证”是什么意思吗?我不明白insert语句怎么会有“旧ID”?
INSERT INTO tableA
OUTPUT  inserted.[ID],inserted.[col1],inserted.[col2],inserted.col3,
INTO #tmptable