查询中的 select 语句导致无法编译
Posted
技术标签:
【中文标题】查询中的 select 语句导致无法编译【英文标题】:select statement in the query is causing to not compile 【发布时间】:2011-11-09 22:24:43 【问题描述】:这个简单的代码导致 sp 无法编译并出现各种错误:我要做的就是在客户站点检查这个表,如果它是空的,那么我们不会显示应用程序。
if (select count(*) from oen.dbd_c_modules) > 0 begin
insert into [OEN].[DBD_C_MODULES]([MODULE_ID], [DESCRIPTION], ACTIVE)
VALUES(11,'Medications',1)
end
go
错误: 消息 102,级别 15,状态 1,过程 DBD_GET_MEDICINE,第 24 行 'end' 附近的语法不正确。 消息 137,第 15 级,状态 2,第 15 行 必须声明标量变量“@DATEFROM”。 消息 137,第 15 级,状态 2,第 16 行 必须声明标量变量“@DATEFROM”。 消息 137,第 15 级,状态 2,第 39 行 必须声明标量变量“@FACILITYKEY”。 消息 156,第 15 级,状态 1,第 52 行 关键字“AND”附近的语法不正确。 消息 156,第 15 级,状态 1,第 56 行 关键字“AND”附近的语法不正确。
代码:在这里:http://www.mediafire.com/?16qr8xaszq025b6
【问题讨论】:
你使用什么风格的 SQL? 你能显示SP的所有代码吗? 你声明了它抱怨的变量吗? @Borodin - 错误消息看起来像 SQL 服务器消息,尽管具体版本未知。语法也与 SQL Server 一致。 它的 sql server 2008 r2 这里是代码。 【参考方案1】:我认为我们需要查看所有代码 - 不在 sn-p 中的错误列表变量和 GO
关键字不是存储过程的 TSQL 语法的一部分,它是批处理标记的结束SSMS。 (GO
关键字如果真的存在,可能会导致您的问题)
查看您发布的完整代码,您在存储过程中放置了 GO 关键字,这是无效的 TSQL 语法,它“结束”了您发送到服务器的批处理,因此将存储过程减半。然后错误来自它抱怨 GO 关键字,然后尝试运行您提交的第二批(过程的后半部分),此时它不知道您声明的变量是什么,因此抛出错误在那些很好的衡量标准上。
只需删除代码中的“GO”,然后再次尝试编译。
【讨论】:
【参考方案2】:你不需要 if(...):
INSERT INTO [OEN].[DBD_C_MODULES]([MODULE_ID], [DESCRIPTION], ACTIVE)
VALUES(11,'Medications',1)
WHERE (select count(*) from oen.dbd_c_modules) > 0
;
[就我个人而言,我不赞成不相关的子查询,但那是另一回事]
编辑: 替代配方:
INSERT INTO [OEN].[DBD_C_MODULES]([MODULE_ID], [DESCRIPTION], ACTIVE)
VALUES(11,'Medications',1)
WHERE NOT EXISTS (select * from oen.dbd_c_modules)
;
【讨论】:
我收到错误消息 156、级别 15、状态 1、过程 DBD_GET_MEDICINE、第 16 行关键字“WHERE”附近的语法错误。消息 102,级别 15,状态 1,过程 DBD_GET_MEDICINE,第 16 行 '>' 附近的语法不正确。以上是关于查询中的 select 语句导致无法编译的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 select 语句查询数据得到 ORA-22905:无法访问非嵌套表项中的行
Mysql查询语句使用select.. for update导致的数据库死锁分析