使用SQL关键字作为不带括号的名称
哪些关键字可以用作无括号的名称,哪些不可以 为什么有些SQL关键字可以用作名称,而其他关键字则不能用作名称? 在确定哪些模式我可以使用,哪些模式我不能使用时不尝试编译并出错,这有什么模式吗 我的印象是不允许使用较旧的关键字,但允许使用较新的关键字,以便较新的SQL版本与较旧的SQL版本尽可能兼容 在下面的示例中,rollup可以用作不带括号的名称,但group不能使用SQL关键字作为不带括号的名称,sql,sql-server-2008,keyword,naming,brackets,Sql,Sql Server 2008,Keyword,Naming,Brackets,哪些关键字可以用作无括号的名称,哪些不可以 为什么有些SQL关键字可以用作名称,而其他关键字则不能用作名称? 在确定哪些模式我可以使用,哪些模式我不能使用时不尝试编译并出错,这有什么模式吗 我的印象是不允许使用较旧的关键字,但允许使用较新的关键字,以便较新的SQL版本与较旧的SQL版本尽可能兼容 在下面的示例中,rollup可以用作不带括号的名称,但group不能 if object_id('accident') is not null drop table accident create ta
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行关键字“group”附近的语法不正确。
味精156,第15级,状态1,第36行
关键字“group”附近的语法不正确
这里有一个保留关键字的列表,您可以在中找到它。太长了,无法粘贴到这个答案中。所有保留关键字都必须转义。在您的示例中,
rollup
不是保留关键字,而group
是保留关键字
ISO标准中有更多的KYWORD。请在同一链接中查看以下注释:
此外,ISO标准定义了保留关键字的列表。避免对对象名称和标识符使用ISO保留关键字。下表所示的ODBC保留关键字列表与ISO保留关键字列表相同
ISO标准保留关键字列表有时比SQL Server限制性更强,有时限制性更小。例如,ISO保留关键字列表包含INT。SQL Server不必将其区分为保留关键字
Transact-SQL保留关键字可用作数据库或数据库对象(如表、列、视图等)的标识符或名称。使用带引号的标识符或带分隔符的标识符。使用保留关键字作为变量和存储过程参数的名称不受限制
看看这里:
GROUP
在列表中,ROLLUP
不是。这只是我的观点,但总的来说这是一种非常糟糕的做法。如果你愿意的话,这是我最讨厌的事。@David:为什么这是“非常糟糕”的做法?只要编译器能够基于语法和上下文消除歧义,我就应该被允许以我喜欢的任何方式命名我的构造。否则我必须找到同义词或缩写词。我得说,编译器保留单词是非常糟糕的做法。SQL中有这么多保留字,很难找到好的名称。我还要说,在一种语言中使用不一致的命名约定是一种非常糟糕的做法——有些名称使用下划线,有些不使用下划线(知道为什么吗?):XMLEXISTS、CURRENT_PATH、SQLWARNING、STDDEV_POP、SEMANTICSIMILARITYDETAILSTABLE、SYSTEM_USER、LOCALTIMESTAMP,当前\u时间戳,当前\u默认\u转换\u组-真是一团糟。我会毫不犹豫地在这个混乱中使用任何我喜欢的名字——这不会让它变得更混乱。这个列表还包含了未来关键词的列表,汇总就在其中。现在我明白了为什么使用不带括号的汇总不是一个好主意,因为它可能会从未来迁移到现有代码。