如何使用'终止字符生成脚本'

时间:2017-03-25 18:52:39

标签: sql sql-server ssms

enter image description here enter image description here我希望将sql数据批量复制到其他数据库。但问题在于,当我尝试执行此插入语句时。

它给我一个像

这样的错误
    Msg 105, Level 15, State 1, Line 1
    Unclosed quotation mark after the character string ''.
    Msg 102, Level 15, State 1, Line 1
    Incorrect syntax near ''.

我找到了N' '创建问题的解决方案。但是当我替换它时,它只是应对N'。那么如何才能取代整个查询。有太多行,所以我不能手动到N''

尝试复制时只需复制此部分

    INSERT [dbo].[HaveWantMaster]
       ([HaveWantMasterID],
        [Type],
        [Description],
        [TotalAvailable],
        [Status],
        [Deleted],
        [CreatedBy],
        [CreatedOn],
        [UpdatedBy],
        [UpdatedOn])
VALUES (409,
        0,
        N'tap',
        3,
        N'

2 个答案:

答案 0 :(得分:1)

一个简单的例子如下: PRINT 'THIS IS AMAZING

  

Msg 105,15级,1号国家,1号线后的未公开引号   字符串'这令人惊叹'。

     

Msg 102,Level 15,State 1,Line   1'这是令人惊讶'附近的语法不正确。

相反,请正确关闭字符:PRINT 'THIS IS AMAZING'

ASCII字符的分隔符(')或CHAR(39)是SQL Server中表示字符串的特殊字符。当解析器读取此字符时,它会假定前一个字符,直到下一个类型(')的分隔符是同一个字符串的一部分。

PRINT ASCII(CHAR(39) + ' ' + CHAR(39))
PRINT ASCII(' ')
  

[Delimiter]:39 [Space]:32

解析器读取第一个语句与CHAR(39)+''+ CHAR(39)相同(因为''和''代表每个单引号),所以优化器足够聪明,可以识别重复的分隔符并返回特殊字符。

但是,在您的代码中,您未能向我们提供实际代码,因此我们无法验证您的代码是否包含您的环境未显示的特殊字符。您可以复制粘贴原始text / sql文件中的“space”,并检查CL / RF个字符等特殊字符。

SELECT ASCII('
')
  

13

注意CHAR(13)经常被误认为是CHAR(10),前者开始等同于键盘上的回车键,即使在查询中它们在这个例子中看起来有效:

PRINT 'HOW ABOUT THIS' + CHAR(10) + 'BROWN COW' + CHAR(13) + 'HOLY MOLY'
--returns
HOW ABOUT THIS
BROWN COW
HOLY MOLY

<强>结论

  • 调查错误的实际位置。该消息告诉您未分隔分隔符,而不是它失败的位置。
  • 如果它来自动态SQL,请理解可以在字符串中包含结构不正确的查询。

例如

EXEC(' PRINT''MyPeople')

将通过解析器,但这实际上是读取

PRINT'MyPeople
  • 检查可能使解析器失败的特殊字符,并再次考虑运行此批处理的内容。 环境非常重要
  • N'语法失败。 (N)只是告诉解析器它处理NVARCHAR个字符。您必须将所有分隔符括在SQL Server中。

答案 1 :(得分:0)

现在来点。Ascii 0 (zero) written to char(1) field
 由于null-terminated (ASCII 0),它开始出错。根据{{​​3}}

问题是,SQL Server中的字符串不是以C ++中的字符串为空终止(ASCII 0) - 因此当您从C ++将单字符字符串写入SQL Server时,您只获得第一个字符(实际上有两个;字符和终结符) - 终结符实际上是被截断的。当您尝试编写“空白”字符串(实际上只包含终结符)时,不会发生任何拼合。所以你自己就得到了终结者。