创建与使用GO相关的存储过程语法

时间:2009-06-25 11:43:39

标签: sql sql-server sql-server-2005 stored-procedures

有谁知道原因。

CREATE PROCEDURE My_Procedure
    (@Company varchar(50))  
AS  
    SELECT PRD_DATE 
    FROM WM_PROPERTY_DATES 
    WITH (NOLOCK) 
    WHERE PRD_COMPANY = @Company 
GO

在SQL管理工作室中给我一条错误消息:

  

Msg 102, Level 15, State 1, Procedure My_Procedure, Line 1 Incorrect syntax near 'GO'.

现在,这是批次的最后一个陈述,也许最后一个陈述不应该有GO

10 个答案:

答案 0 :(得分:8)

如果您转到“另存为...”,请单击“保存”按钮上的小向下箭头,然后选择“使用编码保存...”,然后您可以将行结尾设置为Windows(CR LF)。这似乎解决了我的问题......

答案 1 :(得分:3)

您目前在问题中拥有的SQL将正常运行。你在Kev编辑帖子之前没有格式化的sql不会。原因是你把GO和sql放在同一行。它需要在一个单独的行上。

答案 2 :(得分:2)

SQL Server中发布了一个错误地解析GO语句的错误。我相信当你可以 GO X 并多次执行批次 X 时就会引入它。

有时我必须添加一个评论部分(“ - ”)来强制解析器终止而不是产生语法错误。当我在一批代码中有400,000行时就已经看到了这一点。

示例:

打印“这是一个测试。”

GO -

打印“这不是测试。”

GO 5 -

答案 3 :(得分:2)

如果您使用Unix / Mac EOL从文本编辑器中复制粘贴文本(例如Notepad ++支持此操作),则GO被解释为与最后一个TSQL语句位于同一行(但在屏幕上您可以正常看到换行符)。在文本编辑器中将EOL转换为Windows(CRLF)修复了问题。虽然非常棘手。

答案 4 :(得分:1)

此sql的错误

ALTER PROCEDURE My_Procedure
    (@Company varchar(50))  
AS  
    SELECT PRD_DATE 
    FROM WM_PROPERTY_DATES 
    WITH (NOLOCK) 
    WHERE PRD_COMPANY = @Company GO

Msg 102, Level 15, State 1, Procedure My_Procedure, Line 7
Incorrect syntax near 'GO'.

请注意第7行,原始问题有第1行

如果我把GO放在自己的行上,那么SQL工作正常。

鉴于您的错误消息显示为第1行,似乎由于某种原因,您的sql中没有发生正确的CR / LF。

答案 5 :(得分:0)

您可以在批次结束时使用GO。我认为这段代码本身并没有错。在@Company之后加一个分号。

答案 6 :(得分:0)

我在2008服务器上尝试了这个SQL,创建了一个表WM_PROPERTY_DATES并添加了两列,PRD_DATE和PRD_COMPANY。

工作得很好并创造了proc。也许您可以尝试将代码放在BEGIN ... END块中,看看问题是否仍然存在。

拉​​吉

答案 7 :(得分:0)

你说

  

现在,这是a的最后一个陈述   批处理,也许是最后一句话应该   没有GO?

这意味着这些行都是提交给SQL的同一批次的一部分。问题是,CREATE PROCEDURE(或CREATE FUNCTION或CREATE VIEW)语句必须是批处理中的第一个语句。因此,在CREATE语句前放置一条“GO”行,看看会发生什么。

菲利普

答案 8 :(得分:0)

在我的情况下,我从网页上复制了部分代码,似乎用不同的编码保存了页面,我尝试使用不同编码的短信保存,但是没有用。

要修复我的问题,我将代码复制到NodePad,然后以ANSI格式保存并重新打开查询

答案 9 :(得分:-1)

在每个声明之后,没有严肃的公司可能会假装添加GO。也许在每个批次之后。

GO不是Transact-SQL语句。是否通过ISQLW(aka.Query analizer),osql,sqlcmd和SSMS(Management Studio)等工具理解分隔符。这些工具将SQL文件分成批处理,由GO(或任何“批处理分隔符”集合)分隔,以便准确,但通常是GO),然后一次一批地发送到服务器。服务器永远不会看到GO,如果它会看到它,那么它会报告错误102,语法不正确,如您所见。