我在一台计算机上有一个SQL Server 2008数据库实例。现在我想将此数据库复制到另一台机器。我使用SQL Management Studio中的脚本向导生成带有架构和数据的SQl脚本。脚本文件相当大(大约17 GB)。
然后我在目标机器上运行sql-script,结果是:
消息105,级别15,状态1错误消息: 字符串后面的未闭合引号
我确实理解未闭合引号的含义。但我不明白错误发生的原因。是不是脚本生成器能够处理文本字符串中的引用,例如... hello,是什么?正确并创建一个将转义这些字符的脚本?
他们对脚本向导的文本长度有限制吗?这是否会导致问题。
我不想和我无法在文本编辑器中打开脚本文件(太大,文本编辑器会崩溃)并手动修复问题。
你有什么想法吗?
答案 0 :(得分:4)
为了将数据从一个SQL Server移动到另一个SQL Server(例如从生产环境到测试环境),使用"生成脚本" SQL Server Management Studio中的数据库选项中提供的功能。此操作的结果是带有SQL命令的文本文件,可以在另一个SQL Server上执行。通常这些文件太大而无法在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
如果第一种方法没有帮助并且问题仍然存在,那么还有另一个更困难的解决方案:
转到SQL Server Management Studio生成的SQL文件所在的目录。你需要使用Linux样式斜杠" /"而不是Windows样式,即" \"
cd d:/temp
将SQL文件的编码从UTF-16LE更改为UTF-8,因为" sed"无法处理UTF-16LE,这种转换对数据是安全的。结果将是一个新文件,我们将在下一步中使用
iconv -f UTF-16LE -t UTF-8 input.sql > input_utf8.sql
转换新文件,在一个批处理中包含一个SQL查询。结果将是一个新文件,我们将在下一步中使用
sed -e 's/^INSERT/GO\nINSERT/' input_utf8.sql > input_utf8_adapted.sql
现在文件" input_utf8_adapted.sql"应该由sqlcmd处理而不会出现任何问题,因此我们可以执行以下操作:
sqlcmd -i input_utf8_adapted.sql -a 32767 -o import_log.txt
执行完毕后,请检查import_log.txt以确保没有出现错误
答案 1 :(得分:0)
不是问题的直接答案,但是为了解决这个问题,您可以使用以下其他方法之一将数据库复制到新位置。
方法1通常是优选的,因为它使源DB保持在线并且分离可能导致主数据库中关于源的信息丢失(例如,启用全文的状态)
答案 2 :(得分:0)
编辑:刚从评论中注意到您正在运行sqlcmd -S server\database -i script.sql
。有一个-I
开关代表“启用带引号的标识符”。尝试使用此开关运行命令。
顺便说一句,要编辑大文件,请考虑使用一个不错的编辑器,如Notepad++或UltraEdit。我不会使用没有em的工作站:)
答案 3 :(得分:0)
在试图找到我遇到的类似问题的解决方案后,我最终遇到了这个问题。我还需要通过“生成脚本”向导转储一个数据库(包含数据),结果文件太大而无法从SSMS执行。所以我尝试了sqlcmd
,但以错误
Sqlcmd:错误:文件'script.sql'中命令'“'附近第10行的语法错误。
事实证明,造成此问题的原因是包含 data 且其中包含jQuery语法-$(".someclass")
的记录。这是因为它也是将变量插入sqlcmd
的一种方法。
解决方案是通过添加-x
命令行参数来禁用变量替换。