我正试图在8个表中插入大约17500000。我已经为此存储了过程。在该程序的开始和结束时,我已经编写了Transaction。
错误:由于"ACTIVE_transaction",数据库"database"的事务日志已满。
注意:我想保留事务中的所有内容,它的自动化过程。此过程将每月在数据库上运行
CREATE OR ALTER PROCEDURE [dbo].[InsertInMainTbls]
AS
BEGIN
PRINT('STARTED [InsertInMainTbls]')
DECLARE @NoRows INT
DECLARE @maxLoop INT
DECLARE @isSuccess BIT=1
BEGIN TRY
BEGIN TRAN
--1st table
SET @NoRows = 1
SELECT @maxLoop=(MAX([col1])/1000)+1 FROM ProcessTbl
SELECT 'loop=='+ CAST(@maxLoop as Varchar)
WHILE (@NoRows <= @maxLoop)
BEGIN
INSERT INTO MainTbl WITH(TABLOCK)
( col1,col2,col3....col40)
SELECT
( val1,val2,val3....val40)FROM
ProcessTbl
WHERE [col1] BETWEEN (@NoRows*1000)-1000
AND (@NoRows*1000)-1
SET @NoRows = @NoRows+1;
END
--2nd table
.
.
.
--8th table
SET @isSuccess=1;
COMMIT TRAN
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE();
SELECT ERROR_MESSAGE() 'ErrorMsg' ;
SET @isSuccess=0;
ROLLBACK TRAN
END CATCH
尽管拥有如此庞大的事务是无稽之谈,但您可以通过用timespamp或GUID之类的东西标记行来手动回滚,为此,您需要在事务日志文件中有必要的空间来存储从第一个到最后一个的所有插入的行,加上其他用户将同时进行的所有事务。许多解决方案可以解决您的问题:1( 放大交易日志文件2( 添加一些补充日志文件3( 删除或减少交易范围