我有一个不适合内存的大 SQL 文件,需要针对 Microsoft SQL Server 2008 执行。似乎该sqlcmd.exe
工具总是先将其加载到内存中,这在这种情况下是不可能的。有任何想法吗?
不幸的是,我无法拆分脚本,因为它是由 Red Gate 出色的 SQL 数据比较生成的。整个脚本是一笔大交易,我想保持这种状态。我从来没有想过拥有一个巨大的脚本是不寻常的,因为在数据库世界中拥有大量数据是很常见的。脚本大小为 3gb。
我有一个不适合内存的大 SQL 文件,需要针对 Microsoft SQL Server 2008 执行。似乎该sqlcmd.exe
工具总是先将其加载到内存中,这在这种情况下是不可能的。有任何想法吗?
不幸的是,我无法拆分脚本,因为它是由 Red Gate 出色的 SQL 数据比较生成的。整个脚本是一笔大交易,我想保持这种状态。我从来没有想过拥有一个巨大的脚本是不寻常的,因为在数据库世界中拥有大量数据是很常见的。脚本大小为 3gb。
RedGate 的 SQL 比较具有直接执行语句的选项,而不是生成 SQL 脚本并稍后执行。这是否有原因不起作用 - 换句话说,是否有原因需要 SQL 脚本并且不能使用应用程序的“立即同步”功能?
几个月前我遇到了这个问题。我每周和每月使用 SQLDataCompare 为我们的几个目录数据库生成同步脚本,它们通常大于 500MB。我的解决方案是编写一个 VBscript,将更新脚本分成 50 到 1000 个命令批次。这种方法的问题是,如果数据库更新中途出现问题,则无法回滚所有更改。
什么/谁创建了 SQL 脚本?通过事务或语句(取决于文件的结构)获取创建文件以将脚本拆分为逻辑块的任何内容。如果源无法做到这一点,则编写一个脚本以逻辑拆分文件。
如果它那么大,那么脚本要么太复杂,要么重复。在任何一种情况下,正如其他人所建议的那样,唯一明智的做法是将其分解为可管理的块。
这是一次性练习还是常规活动?
在脚本具有与 OpenXML 一起使用的巨大 XML 字符串之前,我遇到过这个问题。实际的 SQL 相当小,更新了表中的一些值。
我最终将数据(以块的形式)插入到一个临时表中,直到存储了 XML 中的所有信息。然后我运行了我的更新声明。
在发布更多数据后添加:
您可能希望在工具中选择大块并让 SQL 数据比较以块的形式生成脚本。这样你就可以得到交易。您可以通过简单地突出显示范围并点击空格键来选择较大的部分。
据我了解,SSMS 是 32 位的,因此它无法加载超过 1.5-2 GB 的脚本。您可以在 SQLCMD.exe 中运行脚本,但是由于事务大小,您可能会遇到问题——SqlCmd 会将整个事务保存在内存中。因此,您可以在 SQL 数据比较中执行的操作是进入选项并使用“拆分事务”,这可能会有所帮助。
SQL Data Compare 还将对 BLOB 进行部分更新,这将解决“巨大的 BLOB”问题。
这当然是基于最新版本的数据比较。某些版本可能没有这些功能。
另一种选择可能是使用 SQL Compare 为文件夹创建架构脚本,然后使用 SDC 将数据同步到该文件夹中。然后,每个表都有一个文件,而不是一个大文件。
希望这可以帮助。
1-800-redgate-支持.....
或者
使用sqlcmd
命令
例子:
sqlcmd -S myServer\instanceName -i C:\myScript.sql