如何在Microsoft SQL Server中一次执行多个“插入值”语句

时间:2019-01-23 19:08:33

标签: sql sql-server

我正在执行语句

insert into [dbo].[Table_1] 
values ('43546354354', '35435454351', 'vvish', GETDATE(), 'vvish', GETDATE())

总共154,155行。我尝试过,并遇到以下错误。

  

该脚本超出了Transact-SQL IntelliSense最大脚本大小设置。您可以在“工具/选项”菜单中的“文本编辑器” /“ Transact-SQL / IntelliSense”页面上更改设置。

我还去了Tools => Options => TextEditor => Transact-sql => Intellisense并将“最大脚本大小增加到5MB”。

我尝试将每个50,000行的行移动到不同的脚本,但是移动和执行它花费了很长时间。我还有许多其他大小相同的脚本。任何建议请帮我。

5 个答案:

答案 0 :(得分:1)

具有多个连接。期。严重的是,这已经是SQL Server的局限性(一个连接一次只能操作一件事情-MARS很好,但是您仍然只能每行发送和执行一条语句)。

因此,运行一个池行,让X个线程打开一个连接,然后逐行发送线。

另一种方法是拆分文件并并行执行它们-相同的概念,只是每行级别不在一行上。

或者只是变得真实,并使用解析它们的代码并使用SqlGBulkLoad。永远不要这样写语句本身,有很多方法可以更有效地批量加载数据,然后处理sql语句。

答案 1 :(得分:0)

通过将多个元组附加到单个INSERT ... VALUES语句中,您也许可以提高性能:

insert into [dbo].[Table_1] 
  values ('43546354354', '35435454351', 'vvish', GETDATE(), 'vvish', GETDATE()),
         ('43546354355', '35435454352', 'vvisx', GETDATE(), 'vvisx', GETDATE()) 

但是即使声明较少,您仍然会遇到最大文件大小限制。

答案 2 :(得分:0)

这取决于其他一些因素。 如果表没有触发器,索引等,则可以使用“ sqlcmd”命令进行加载。 只需生成您的脚本并将其放在文件中即可。然后,您可以在Windows NT Shell中运行以下脚本:

sqlcmd -S MyServer -d MyDatabase -E -I -i MyScript.sql

但是,正如TomTom所建议的,有更多漂亮/更快的方法可以直接从文件加载而不是生成脚本。

答案 3 :(得分:0)

您可以构建存储过程来处理插入,并让该存储过程将用户定义的表类型作为参数,这将允许您将数据作为表传递给该存储过程,并且该存储过程可以运行只要需要。我做出一个危险的假设,即您要从某种文件中获取数据并开发这些sql命令,因此我建议将C#与dapper一起使用,以将create传递并将datatable传递给存储过程。

答案 4 :(得分:0)

您列出的错误与IntelliSense有关,与您的查询无关。

IntelliSense说,“嘿,这东西很大。我什至不去尝试。”

我怀疑您使用Redgate或类似工具来生成更新脚本,发现它太大,然后将其分解成碎片。

您需要做的是确保您拥有

使用[YourDataBaseName] 开始

位于每个查询的顶部。

然后在执行时,应将结果列出。

如果这回答了您的问题,请投票。经过几年的Stack Overflow依赖,我终于有了足够的街头信誉来发布答案!