SQL Server 2008 生成脚本向导给了我一个导致“未关闭引号”的脚本

gur*_*kan 3 sql-server wizard sql-server-2008

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

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

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

我确实理解未闭合引号的含义的问题。但我不明白为什么会发生错误。脚本生成器不能处理文本字符串中的引号,例如...你好,怎么了...正确地创建一个可以转义这些字符的脚本?

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

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

你有什么想法?

And*_*kyy 5

SQL Server 导入问题的解决方案

前提

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

    • 安装 Cygwin
      • 在安装过程中,经过一些标准屏幕后,在屏幕上停止“选择包”
      • 在“搜索”栏中输入“sed”,在下面的树中展开“Base”类别并选择不低于4.2.2的版本进行安装
      • 完成安装
      • 注意:“sed”是 Linux 实用程序,它允许基于流的文件处理
    • 安装完成后,从桌面运行“Cygwin64 Terminal”。我们将在接下来的步骤中使用它
    • 转到 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,确保没有出现错误