【发布时间】:2014-01-15 00:28:27
【问题描述】:
哪些关键字可以用作不带括号的名称,哪些不可以?
为什么某些 SQL 关键字可以用作名称而其他关键字不允许? 是否有任何模式可以确定哪些我可以使用,哪些我不能不尝试编译并得到错误?
我的印象是不允许使用较旧的关键字,但允许使用较新的关键字,以便较新的 SQL 版本尽可能与旧的兼容。
在以下示例中,汇总可以用作不带括号的名称,但组不能。
if object_id('accident') is not null drop table accident
create table accident(
state varchar(50)
,city varchar(50)
,zip varchar(50)
,person varchar(50)
,id int identity(1,1)
)
insert accident(state,city,zip,person)values
('NY','Manhattan',10001,'John')
,('NY','Manhattan',10001,'John')
,('NY','Manhattan',10001,'Barbara')
;with
rollup as (
select accident.*
,lvl = grouping_id(accident.state,accident.city,accident.zip,accident.person,accident.id)
,accidents=count(1)
,people=0
from accident
group by rollup(accident.state,accident.city,accident.zip,accident.person,accident.id)
)
select * from rollup
;with
[group] as (
select accident.*
,lvl = grouping_id(accident.state,accident.city,accident.zip,accident.person,accident.id)
,accidents=count(1)
,people=0
from accident
group by rollup(accident.state,accident.city,accident.zip,accident.person,accident.id)
)
select * from [group]
尝试使用组作为不带括号的名称
;with
group as (
select accident.*
,lvl = grouping_id(accident.state,accident.city,accident.zip,accident.person,accident.id)
,accidents=count(1)
,people=0
from accident
group by rollup(accident.state,accident.city,accident.zip,accident.person,accident.id)
)
select * from group
给出错误:
消息 156,第 15 级,状态 1,第 28 行
关键字“组”附近的语法不正确。
消息 156,第 15 级,状态 1,第 36 行
关键字“组”附近的语法不正确。
【问题讨论】:
-
看看这里:technet.microsoft.com/en-us/library/ms189822.aspx
GROUP在列表中,ROLLUP不在。 -
只是我的意见,但总的来说这是一个非常糟糕的做法。如果你愿意的话,我的一个小烦恼。
-
@David:为什么这是“非常糟糕”的做法?只要编译器可以根据语法和上下文消除歧义,就应该允许我以任何我喜欢的方式命名我的构造。否则我必须找到同义词或缩写词。我会说编译器保留单词是非常糟糕的做法。 SQL 中有这么多保留字,很难找到好名字。
-
我还要说在一种语言中使用不一致的命名约定是非常糟糕的做法 - 有些名称使用下划线,有些则不使用(知道为什么吗?):XMLEXISTS、CURRENT_PATH、SQLWARNING、STDDEV_POP、 SEMANTICSIMILARITYDETAILSTABLE、SYSTEM_USER、LOCALTIMESTAMP、CURRENT_TIMESTAMP、CURRENT_DEFAULT_TRANSFORM_GROUP - 真是一团糟。我会毫不犹豫地在这个混乱中使用任何我喜欢的名字 - 它不会让它变得更加混乱。
标签: sql sql-server-2008 keyword naming brackets