SQL Server 2008生成脚本向导为我提供了一个脚本,导致“未闭合的引号”

时间:2010-09-12 13:36:46

标签: sql-server sql-server-2008 wizard

我在一台计算机上有一个SQL Server 2008数据库实例。现在我想将此数据库复制到另一台机器。我使用SQL Management Studio中的脚本向导生成带有架构和数据的SQl脚本。脚本文件相当大(大约17 GB)。

然后我在目标机器上运行sql-script,结果是:

消息105,级别15,状态1错误消息: 字符串后面的未闭合引号

我确实理解未闭合引号的含义。但我不明白错误发生的原因。是不是脚本生成器能够处理文本字符串中的引用,例如... hello,是什么?正确并创建一个将转义这些字符的脚本?

他们对脚本向导的文本长度有限制吗?这是否会导致问题。

我不想和我无法在文本编辑器中打开脚本文件(太大,文本编辑器会崩溃)并手动修复问题。

你有什么想法吗?

4 个答案:

答案 0 :(得分:4)

SQL Server导入问题的解决方案

预条件

为了将数据从一个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
    
  • 如果第一种方法没有帮助并且问题仍然存在,那么还有另一个更困难的解决方案:

    • 安装Cygwin
      • 在安装过程中,在一些标准屏幕之后,停在屏幕上"选择包"
      • In" Search"字段,输入" sed",然后在下面的树中展开" Base"类别并选择版本不低于4.2.2进行安装
      • 完成安装
      • 注意:" sed"是允许基于流的文件处理的Linux实用程序
    • 安装完成后,运行" Cygwin64终端"从桌面。我们将把它用于后续步骤
    • 转到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. Copying Databases with Backup and Restore
  2. Using Detach and Attach
  3. 方法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命令行参数来禁用变量替换。