Создание синтаксиса хранимых процедур, связанных с использованием GO - PullRequest
4 голосов
/ 25 июня 2009

Кто-нибудь знает почему?

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

Дает мне сообщение об ошибке в SQL Management Studio:

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

Теперь это последний оператор пакета, возможно, последний оператор не должен иметь GO?

Ответы [ 10 ]

8 голосов
/ 24 февраля 2011

Если вы перейдете к «Сохранить как ...», нажмите маленькую стрелку вниз на кнопке «Сохранить» и выберите «Сохранить с кодировкой ...», после чего вы можете установить окончание строк в Windows (CR LF). Это, кажется, решило проблему для меня ...

3 голосов
/ 25 июня 2009

sql у вас в данный момент в вопросе будет работать должным образом. Неформатированный sql, который вы имели до того, как Кев отредактировал сообщение, не будет. Причина в том, что у вас был GO на той же линии, что и SQL. Это должно быть на отдельной строке.

2 голосов
/ 20 августа 2012

Если вы копируете и вставляете текст из текстового редактора с помощью EOL Unix / Mac (например, Notepad ++ поддерживает это), GO интерпретируется как находящийся в той же строке, что и последний оператор TSQL (хотя на экране вы можете видеть новые строки в обычном режиме). Преобразование EOL в Windows (CRLF) в текстовом редакторе решило проблему. Хотя очень сложно.

2 голосов
/ 20 апреля 2011

В SQL Server выпущена ошибка, которая неправильно анализирует оператор GO. Я полагаю, что это было введено, когда вы могли выполнить GO X и выполнить пакет X несколько раз.

Иногда мне приходилось добавлять секцию комментариев (" - "), чтобы заставить синтаксический анализатор завершать работу, а не вызывать синтаксическую ошибку. Это было видно, когда у меня было 400 000 строк в пакете кода.

Пример:

ПЕЧАТЬ "Это тест."

GO -

ПЕЧАТЬ "Это не тест."

GO 5 -

1 голос
/ 25 июня 2009

Ошибка для этого 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.

0 голосов
/ 30 августа 2016

В моем случае я скопировал часть кода с веб-страницы, и кажется, что сохранил страницу с другой кодировкой, я пробовал SaveAs из SMS с другой кодировкой, но не работал.

Чтобы исправить мою проблему, я копирую код в NodePad, затем сохраняю его в формате ANSI и заново открываю запрос

0 голосов
/ 25 июня 2009

Вы сказали

Теперь, это последнее утверждение партия, может быть, последнее утверждение должно нет GO?

Это означает, что все эти строки являются частью одного пакета, отправленного в SQL. Дело в том, что оператор CREATE PROCEDURE (или CREATE FUNCTION или CREATE VIEW) должен быть оператором first в пакете. Поэтому поместите строку «GO» перед оператором CREATE и посмотрите, что произойдет.

Philip

0 голосов
/ 25 июня 2009

Я попробовал этот SQL на своем сервере 2008 года, создав таблицу WM_PROPERTY_DATES и добавив 2 столбца, PRD_DATE и PRD_COMPANY.

Работает просто отлично и создает проц. Возможно, вы можете попробовать поместить свой код в блок BEGIN ... END и посмотреть, не исчезнет ли проблема.

Raj

0 голосов
/ 25 июня 2009

Ни одна серьезная компания не может претендовать на добавление GO после каждого заявления . Возможно после каждой партии .

GO не является оператором Transact-SQL . Это разделитель, который понимают такие инструменты, как ISQLW (он же Query analyzer), osql, sqlcmd и SSMS (Management Studio). Эти инструменты разбивают файл SQL на пакеты, разделенные GO (или любым другим набором «пакетных разделителей», чтобы быть точным, но обычно GO), а затем отправляют на сервер по одной партии за раз. Сервер никогда не видит GO, и если он его увидит, он сообщит об ошибке 102, неправильный синтаксис, как вы уже видели.

0 голосов
/ 25 июня 2009

У вас наверняка может быть GO в конце вашей партии. Я не вижу ничего плохого в этом коде как таковом. Поставьте точку с запятой после @Company.

...