【问题标题】:Incorrect syntax near 'go' in SQL Server Management StudioSQL Server Management Studio 中“go”附近的语法不正确
【发布时间】:2011-12-05 23:58:18
【问题描述】:

执行以下 SQL:

drop function f
go

在 MS Sql Server Management Studio 中给我这个解析错误:

消息 102,级别 15,状态 1,行 1 'go' 附近的语法不正确。

为什么?

如果我打开一个新选项卡并将 SQL 复制/粘贴到其中,它也会失败。 但是,如果我打开一个新选项卡并完全重新键入 SQL,它就可以正常工作。

【问题讨论】:

  • 你大概有一个不可见的角色在那里搞砸了。
  • 很明显,您复制粘贴的内容不正确 - 为什么不复制粘贴您输入的内容,那么您知道它会起作用吗?
  • 是的。我最终自己找到了解决方案,但我决定在这里发布它,因为我很沮丧,因为我无法通过网络搜索找到它。但它可能仍然很难找到,因为问题可能发生在不同类型的 SQL 代码中。有些查询确实适用于 CR,但我只遇到了 DROP FUNCTION 的问题。
  • @EldritchConundrum - 是的,实际上与我认为会在上面链接的问题不同。

标签: sql parsing newline ssms


【解决方案1】:

您打开了一个 Mac 格式的文件,其中包含回车 ('\r') 换行符。

SQL 解析器在 CR 换行符上的行为不一致。 它支持某些查询,例如“select 1 go”,但在其他查询上失败,例如“drop function f go”。

将所有 sql 文件转换为 windows 编码。

【讨论】:

  • SQL(实际上是管理工作室)解析器是一致的 - 在这两种情况下,它都不会将 go 之前的间隙解释为换行符。只是,对于您的 select 1 go 示例,go 是一个完全有效的列别名,而 as 关键字不是必需的。
  • 我现在明白为什么“select 1 go”有效了。由于“select 1 from foo f”有效,而“select 1 from foo f go”失败,语法解析问题可能特定于 GO 及其后的换行符的使用。
【解决方案2】:

SQL Server Management Studio 无法处理一些不可打印的字符。

检查换行符,可能您使用的是 Linux (LF) 或 Mac 风格 (CR) 而不是 Windows 风格(CR 和 LF)。您可以使用任何高级文本编辑器进行检查,例如Notepad++·

【讨论】:

  • UTF-8 字符在使用上述技术时是不可见的。 SSMS 向我显示问题所在的地方有一个非常小的红色下划线。我可以使用 Shift-Arrow > Ctrl-C > Ctrl-H > Ctrl-V 将这个未知字符替换为空字符串(无值)。然后 SQL 脚本正确运行。
【解决方案3】:

一直深受这个问题的困扰。最后,使用记事本++。

修正者:

格式>转换为 UNIX

紧随其后

格式>转换为 Windows

【讨论】:

    【解决方案4】:

    您应该从脚本中删除所有“GO”,它会解决问题。

    查看这里了解更多信息:

    https://agilewebhosting.com/knowledgebase/63/SQL-Error-Incorrect-syntax-near-andsharp039GOandsharp039.html

    矩阵

    【讨论】:

    【解决方案5】:

    我也面临同样的问题,但不确定是什么原因造成的。当复制粘贴查询编辑器时,可以执行它。

    彻底的程序只有它失败了

    从我的程序生成的脚本。

    消息 102,级别 15,状态 1,行 366 'GO' 附近的语法不正确。 消息 156,第 15 级,状态 1,第 370 行 关键字“CREATE”附近的语法不正确。 消息 102,第 15 级,状态 1,第 371 行 'GO' 附近的语法不正确。

    创建表 dbo.[SolutionAssessmentBPF] ( businessprocessflowinstanceid uniqueidentifier NOT NULL , StatusReasonCode int NULL , TimeZoneRuleVersionNumber int NULL , TraversedPath nvarchar (1250) NULL , UTCConversionTimeZoneCode int NULL , TenantId int NOT NULL , OdsCreatedDate datetime NOT NULL DEFAULT GETUTCDATE() , OdsModifiedDate datetime NOT NULL DEFAULT GETD NULL DEFAULT 0 , 版本号 bigint DEFAULT -1 , 约束 [PK_SolutionAssessmentBPF] 主键集群 ( businessprocessflowinstanceid,TenantId ASC )) 去吧

    创建唯一索引 [UQX_SolutionAssessmentBPF_bpf_incidentid_OdsStatus] ON [dbo].[SolutionAssessmentBPF] ([bpf_incidentid], [OdsStatus]) 走 在 [dbo].[SolutionAssessmentBPF] ([OdsModifiedDate]) 上创建非聚类索引 [NCI_SolutionAssessmentBPF_OdsModifiedDate] 去

    从生成的动态 SQL 中删除 GO 语句后,此问题得到修复。请删除 GO 语句和任何与 windows 格式不兼容的不可打印字符。这应该可以解决这类问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多