Sql server 具有多个(1000+;)插入的T-SQL事务断开连接

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,

您可以在事务中插入的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, 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;