Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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_Locking_Bulkinsert_Sql Merge - Fatal编程技术网

Sql 分页将批量数据插入表中

Sql 分页将批量数据插入表中,sql,sql-server,locking,bulkinsert,sql-merge,Sql,Sql Server,Locking,Bulkinsert,Sql Merge,也许这是一个愚蠢的问题,但是如何分割/分页插入以让其他操作更新同一个表呢 我有两个存储过程,一个用于插入批量数据 存储过程插入MyTable: INSERT INTO MyTable (column1, Column2, Column3) SELECT Column1, @Column2, 0 FROM MyOtherTable MyTable的主键是(第1列,第2列) 还可以对同一个表执行MERGE操作MyTable,但可以从另一个来源进行更新(第3列),也可以将数据插入MyTable 问题

也许这是一个愚蠢的问题,但是如何分割/分页插入以让其他操作更新同一个表呢

我有两个存储过程,一个用于插入批量数据

存储过程
插入MyTable

INSERT INTO MyTable (column1, Column2, Column3)
SELECT Column1, @Column2, 0
FROM MyOtherTable
MyTable
的主键是
(第1列,第2列)

还可以对同一个表执行
MERGE
操作
MyTable
,但可以从另一个来源进行更新(第3列),也可以将数据插入
MyTable

问题是,当插入
MyTable
需要花费大量时间1000万条记录时,执行
MERGE
的存储过程必须等待
InsertIntoMyTable
完成

尝试解决此问题时,添加了分页

DECLARE @Start INT = 1
DECLARE @End INT = 1000
DECLARE @Amount INT = 1000
DECLARE @Total INT

SELECT @Total = COUNT(Column1) FROM MyOtherTable WHERE Column2 = @Column2

WHILE (@Start<=@Total)
BEGIN
   INSERT INTO MyTable (column1, Column2, Column3)
      SELECT Column1, @Column2, 0
      FROM (SELECT 
               Column1, 
               Row_number() OVER(ORDER BY Column1) rownumber 
            FROM MyOtherTable 
            WHERE Column2 = @Column2) x
      WHERE x.rownumber between @start and @end

   SET @start = @end+1
   SET @End = @End + @Amount
END
DECLARE@Start INT=1
声明@End INT=1000
声明@Amount INT=1000
声明@Total INT
从MyOtherTable中选择@Total=COUNT(Column1),其中Column2=@Column2

虽然(@Start执行是在事务中进行的,但如果您自己不提供显式事务,SQL Server将使用隐式事务

如果您有超过5000个操作(
插入
删除
更新
)在单个事务中,SQL Server将删除单个行锁,而不是执行锁升级,而是独占地锁定整个表——因此在提交(或回滚)该(可能隐式)事务之前,不可能执行其他操作


插入到1000行块中的部分不应导致锁升级,但当然,在该事务上下文中插入的任何行都不能同时被另一个事务读取或操作。

我已经更改了代码。WHILE(@Start