2012-01-06 23 views
4

这是我的SQL语句的Sybase:近“走出去”的“IF存在”块语法不正确

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

+0

什么是'$'呢? – 2012-01-06 06:06:34

+0

请忽略。我使用vi来检查是否无意中包含了一些垃圾隐形字符,然后复制并粘贴到这里。我删除了其他标记,但错过了这一个。 '$'就是这里的EOL。 – 2012-01-06 06:19:06

+0

哇 - 想到MS购买和吞下任何sybaseish – 2012-01-06 06:23:07

回答

1

试试这个:

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

链接链接到MySQL参考。我的问题是关于TSQL/Sybase – 2012-01-08 22:05:26

+0

@AnthonyKong抱歉,请尝试我已编辑的答案。 – 2012-01-09 09:19:12

-1

应该不是对象的引用有

dbo..PNL_VALUE_ESTIMATE

,因为你没有给一个数据库名,如果包含obj的主人,你需要..错过数据库名称?

我会去:

EXEC( 'DROP TABLE dbo..PNL_VALUE_ESTIMATE')

在真正的部分为好,因为DROP TABLE总是被编译,如果表不存在你仍然会失败。

你甚至需要dbo吗?如果你的sql总是以dbo的形式运行,那么就把它抛出去。

+0

我想..是为了跳过模式名称,而不是跳过数据库名称。 – vstrien 2012-01-11 15:29:35

0

GO不是T-SQL的关键字,而是编辑器的关键字。

SMSS(在其他人之间)使用它作为发送给数据库服务器的批量命令之间的“分隔”。在存储过程或脚本文件中执行它将不起作用。

编辑:也许它适用于SyBase,但我认为在这种情况下它需要大写。

0

从文档中,GO语句是编辑的命令你使用,不SQL本身:

GO不是Transact-SQL语句;它是由 sqlcmd和osql实用程序和SQL Server Management Studio代码 编辑器识别的命令。

这就是说 - Sybase也是一个支持GO语句的编辑器。

我有同样的问题,但与SQL管理工作室。问题在于编辑器不支持某些语句的混合换行符类型 - GO就是其中之一。例如,在Management Studio中,只允许使用Windows风格的换行符(CR + LF),如果我使用Linux格式(LF),则会出现与上述完全相同的错误。

的文本编辑器如记事本++(我用的)有什么类型的结束行字符您使用默认(在Windows,Linux,MAC(CR))的选项。

请检查什么换行符(S)是在你的语句中使用,看看是否能解决这个问题。