Sybase: неправильный синтаксис рядом с 'go' в блоке 'IF EXISTS' - PullRequest
4 голосов
/ 06 января 2012

Это мое заявление sql

IF EXISTS (select 1 from sysobjects where name = 'PNL_VALUE_ESTIMATE')
  drop table dbo.PNL_VALUE_ESTIMATE
go

isql выдает сообщение об ошибке

Msg 102, Level 15, State 1:
Server 'DB_SERVER', Line 3:
Incorrect syntax near 'go'.

Но заявление sql мне кажется правильным. Что не так?

Версия Sybase - 15

Ответы [ 4 ]

1 голос
/ 06 января 2012

Попробуйте это:

IF EXISTS (select 1 from sysobjects where name = 'PNL_VALUE_ESTIMATE')
  drop table dbo.PNL_VALUE_ESTIMATE

go

или это:

IF EXISTS (select 1 from sysobjects where name = 'PNL_VALUE_ESTIMATE')
BEGIN
  drop table dbo.PNL_VALUE_ESTIMATE
END

go

или это:

IF EXISTS (select 1 from sysobjects where name = 'PNL_VALUE_ESTIMATE')
BEGIN
  select 1
END

go

Работает ли что-нибудь?

0 голосов
/ 18 августа 2012

Из документации оператор GO является командой редактора, который вы используете, а не SQL сам по себе:

GO не является оператором Transact-SQL;это команда, распознаваемая утилитами sqlcmd и osql и редактором кода SQL Server Management Studio.

Тем не менее Sybase также является редактором, который поддерживает оператор GO.

У меня была такая же проблема, но с SQL Management Studio.Проблема в том, что редактор не поддерживает смешанные типы новой строки вокруг определенных операторов - GO является одним из них.Например, в Management Studio разрешены только переводы строк в стиле Windows (CR + LF), и если я буду использовать формат Linux (LF), это выдаст ту же ошибку, что и у вас выше.

Текст-редакторы, такие как Notepad ++ (что я использую), имеют опцию того, какой тип символов конца строки вы используете по умолчанию (Windows, Linux, Mac (CR)).

Попробуйте проверить, какой символ новой строки (s) используются в ваших утверждениях, чтобы выяснить, может ли это решить проблему.

0 голосов
/ 11 января 2012

GO - это не ключевое слово T-SQL, а редактор.

SMSS (между другими) использует его как «деление» между пакетами команд, которые он отправляет на сервер базы данных.Выполнение его внутри хранимой процедуры или даже файла сценария не будет работать.

edit: Может быть, это работает с SyBase, но я думаю, что в этом случае нужно будет вводить заглавные буквы.

0 голосов
/ 11 января 2012

Если ссылка на объект не имеет

dbo..PNL_VALUE_ESTIMATE

, потому что вы не указали имя базы данных, и если вы включили владельца obj, который вам нужен ... чтобы пропуститьимя базы данных?

Я бы сказал:

EXEC ('DROP TABLE dbo..PNL_VALUE_ESTIMATE')

также в истинной части, поскольку DROP TABLE всегда компилируетсяи если таблицы нет, у вас все равно будет сбой.

Тебе вообще нужен dbo?Если ваш sql всегда работает как dbo, просто не указывайте.

...