首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何生成具有终止字符的脚本

问如何生成具有终止字符的脚本
EN

Stack Overflow用户
提问于 2017-03-25 18:52:39
回答 2查看 457关注 0票数 0

​

我希望将sql数据批量复制到其他DB。但问题是,当我试图执行这个insert语句时。

它给我的错误就像

代码语言:javascript
复制
    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''执行操作。

当试图复制它时,只需复制以下部分

代码语言:javascript
复制
    INSERT [dbo].[HaveWantMaster]
       ([HaveWantMasterID],
        [Type],
        [Description],
        [TotalAvailable],
        [Status],
        [Deleted],
        [CreatedBy],
        [CreatedOn],
        [UpdatedBy],
        [UpdatedOn])
VALUES (409,
        0,
        N'tap',
        3,
        N'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-25 22:36:31

下面是一个简单的示例:PRINT 'THIS IS AMAZING

Msg 105,第15级,状态1,第1行后的字符串‘这是惊人’开封引号。 Msg 102,15级,State 1,行1不正确的语法在“这是惊人的”附近。

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

ASCII字符的分隔符(')或CHAR(39)是Server中表示字符串的特殊字符。当解析器读取此字符时,它假设继续进行的字符,直到(')类型的下一个分隔符成为同一字符串的一部分。

代码语言:javascript
复制
PRINT ASCII(CHAR(39) + ' ' + CHAR(39))
PRINT ASCII(' ')

划界者: 39空格: 32

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

但是,在您的代码中,您未能向我们提供实际的代码,因此我们无法验证您的代码是否具有环境未显示的特殊字符。您可以从原始的文本/sql文件中复制粘贴“空格”,并检查像CL/RF字符这样的特殊字符。

代码语言:javascript
复制
SELECT ASCII('
')

13

注CHAR(13)经常被误认为CHAR(10),前者相当于键盘上的enter键,尽管在这个示例中它们在查询中看起来实际上是一样的:

代码语言:javascript
复制
PRINT 'HOW ABOUT THIS' + CHAR(10) + 'BROWN COW' + CHAR(13) + 'HOLY MOLY'
--returns
HOW ABOUT THIS
BROWN COW
HOLY MOLY

结论

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

例如

代码语言:javascript
复制
EXEC(' PRINT''MyPeople')

将传递解析器,但实际上是读取。

代码语言:javascript
复制
PRINT'MyPeople
  • 检查可能导致解析器失败的特殊字符,并再次考虑运行此批的是什么。环境是非常重要的。
  • N'语法失败。(N)简单地告诉解析器它正在处理NVARCHAR字符。必须将所有分隔符括在Server中。
票数 1
EN

Stack Overflow用户

发布于 2017-03-26 21:20:10

现在说到重点。Ascii 0 (zero) written to char(1) field。

由于null-terminated (ASCII 0),它开始产生错误。根据ID=47571

问题是,与C++中的字符串一样,Server中的字符串不是以空结尾的(ASCII 0)所以当您将单个字符字符串从C++写入Server时,您只得到第一个字符(实际上有两个字符;字符和终止符) --终止符实际上是被截断的。当您尝试编写“空白”字符串(实际上只包含终止符)时,不会发生任何冲突。所以你得到了终结者本身。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43020543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档