Sql server 具有多个(1000+;)插入的T-SQL事务断开连接
您可以在事务中插入的INSERT语句数量是否有限制? 我收到传输错误,连接在运行语句中间断开。< /P> 我应该只填充一个临时表,然后运行一个INSERT语句吗Sql server 具有多个(1000+;)插入的T-SQL事务断开连接,sql-server,tsql,transactions,sql-insert,Sql Server,Tsql,Transactions,Sql Insert,您可以在事务中插入的INSERT语句数量是否有限制? 我收到传输错误,连接在运行语句中间断开。< /P> 我应该只填充一个临时表,然后运行一个INSERT语句吗 在事务内的1000 +插入中间的错误消息… Msg 233, Level 20, State 0, Line 0 A transport-level error has occurred when receiving results from the server. (provider: Shared Memory Provider,
在事务内的1000 +插入中间的错误消息…
Msg 233, Level 20, State 0, Line 0
A transport-level error has occurred when receiving results from the server.
(provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)
我在本地Windows 8计算机(东芝Satellite S955、x64 8GB RAM、Intel(R)Core(TM)i5-3317U CPU@1.70GHz 1.70GHz)上的数据库上运行SQL Server 2008 R2 10.50.4000.0内部的脚本
您知道每次插入可以插入多个值集
values (), (), ()
有一个最佳的选择。值的总数应小于1024。看起来每个插入有8个值,因此128()。您还可以尝试更基于集合的替代语法
INSERT INTO dbo.Employee ( LastName, FirstName )
Select 'Smith', 'John'
UNION ALL Select 'Jones', 'Mary'
UNION ALL Select 'Packer', 'Penny'
UNION ALL Select 'Stokes', 'Daryl'
工会看起来像一个声明,而不是1290年,因此更好 (1290条包含硬编码内容的单独语句真让我害怕)问题 我相信你的问题在于以下几点:
raiserror('发生错误:%s',20,101,@Msg)和日志
开始,让我们看一下:
的签名。 RAISERROR({msg_id | msg_str |@local_variable}{,严重性,状态}
[,参数[,…n]])
[带有选项[,…n]] 正如所强调的,我想重点关注的是严重性参数。在同一示例中,您将发现以下内容(关于严重性参数): [严重性]是与此消息关联的用户定义的严重性级别 此外: 任何用户都可以指定从0到18的严重性级别。严重性级别从19到25只能由sysadmin固定服务器角色的成员或具有ALTER TRACE权限的用户指定。对于从19到25的严重性级别,需要使用WITH LOG选项 到目前为止,一切顺利。从您的代码片段中,我们可以看到,正在通过
RAISERROR
生成严重级别为20的错误消息。因此,使用带有日志的选项
然而,委员会还注意到:
严重程度从20到25被认为是致命的。如果遇到致命的严重性级别,客户端连接在收到消息后被终止,,错误记录在错误和应用程序日志中
因此,实际上,您对RAISERROR
的调用正在终止您的连接
解决方案
我假设您对CATCH
块的意图是“重新显示”导致CATCH
块运行的原始错误。如果是,请查看以下内容(摘自):
这使用和来收集有关导致CATCH
块运行的错误的信息。然后它使用RAISERROR
生成包含所述信息的新错误消息。您如何执行脚本?这个错误已经发生了,但似乎没有一种方法可以解决每种情况。为了回答您关于语句数量的问题,SQL Server中有一个,但默认为256MB,因此这似乎不太可能成为问题。我只是在SQL Server Management Studio(SQL Server 2008 R2[10.50.400])中针对本地数据库运行脚本。是的,我知道该选项。我还尝试预先填充一个诱人的并调用insert(…)select*from#company_name.然后我会认为这是一个传输错误。尝试不同的交通工具。您可能正在使用命名管道(用于速度)。如果是这样,试试TCP。并尝试不使用raiseerror上的日志。这可能很简单,因为错误违反了约束,但错误消息的大小对于传输来说太大了。我想知道这些数字的来源(每个插入/事务的最大值为1024?)。你能举出一个来源吗?@stakx Optimal与max@Blam:好的,那就“最佳”。我仍然有兴趣了解这个建议。你能举出一个消息来源吗,或者这仅仅是个人经历?
INSERT INTO dbo.Employee ( LastName, FirstName )
Select 'Smith', 'John'
UNION ALL Select 'Jones', 'Mary'
UNION ALL Select 'Packer', 'Penny'
UNION ALL Select 'Stokes', 'Daryl'
...
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT @ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
-- Use RAISERROR inside the CATCH block to return
-- error information about the original error that
-- caused execution to jump to the CATCH block.
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
END CATCH;