gur*_*kan 3 sql-server wizard sql-server-2008
我在一台机器上有一个 SQL server 2008 数据库实例。现在我想把这个数据库复制到另一台机器上。我使用 SQL Management Studio 中的脚本向导生成包含架构和数据的 SQL 脚本。脚本文件相当大(大约 17 GB)。
然后我在目标机器上运行 sql 脚本,结果是:
消息 105,级别 15,状态 1 错误消息:字符串后未关闭引号
我确实理解未闭合引号的含义的问题。但我不明白为什么会发生错误。脚本生成器不能处理文本字符串中的引号,例如...你好,怎么了...正确地创建一个可以转义这些字符的脚本?
他们对脚本向导的文本长度有限制吗?这是否导致问题。
我不想,也无法在文本编辑器中打开脚本文件(太大,文本编辑器会崩溃)并手动修复问题。
你有什么想法?
为了将数据从一个 SQL Server 移动到另一个(例如从生产环境到测试环境),使用 SQL Server Management Studio 的数据库选项中提供的“生成脚本”功能是有意义的。此操作的结果是包含可在另一个 SQL Server 上执行的 SQL 命令的文本文件。通常这些文件太大而无法在 SQL Server Management Studio 中执行,因此我们需要使用SQL Server 安装包中的sqlcmd命令行实用程序。在大多数情况下,实用程序运行顺畅,不需要额外的用户操作。
在极少数情况下,sqlcmd实用程序可能会因导入失败并引发以下错误:“字符串后的未关闭引号...”表示尚未执行 SQL 查询之一。这是因为sqlcmd使用流处理工作,即它读取一些数据,处理它,读取下一块等等。在某些情况下,输入文件可能包含巨大的 SQL 指令,其大小大于sqlcmd一次可以处理的数据量,因此sqlcmd尝试执行损坏的 SQL 并失败。
为了解决这个问题,可以使用 2 种方法:
所述SQLCMD实用程序可以接受的“-a”参数,它定义分组的最大大小(数据片),将加工过程中被使用。最大值为 32767,默认值为 4096,因此始终将此参数与最大值一起使用是有意义的。
sqlcmd -i input.sql -a 32767 -o import_log.txt
Run Code Online (Sandbox Code Playgroud)如果第一种方法没有帮助并且问题仍然出现,还有另一个更困难的解决方案:
转到 SQL Server Management Studio 生成的 SQL 文件所在的目录。您需要使用 Linux 风格的斜杠“/”而不是 Windows 风格的“\”
cd d:/temp
Run Code Online (Sandbox Code Playgroud)将 SQL 文件的编码从 UTF-16LE 改为 UTF-8,因为“sed”无法处理 UTF-16LE,这种转换对数据是安全的。结果将是一个新文件,我们将在下一步中使用
iconv -f UTF-16LE -t UTF-8 input.sql > input_utf8.sql
Run Code Online (Sandbox Code Playgroud)转换新文件,以批量处理一个 SQL 查询。结果将是一个新文件,我们将在下一步中使用
sed -e 's/^INSERT/GO\nINSERT/' input_utf8.sql > input_utf8_adapted.sql
Run Code Online (Sandbox Code Playgroud)现在文件“input_utf8_adapted.sql”应该由sqlcmd处理没有任何问题,因此我们可以执行以下操作:
sqlcmd -i input_utf8_adapted.sql -a 32767 -o import_log.txt
Run Code Online (Sandbox Code Playgroud)执行完成后,请检查import_log.txt,确保没有出现错误