【问题标题】:Using SQL keywords as names without brackets使用 SQL 关键字作为不带括号的名称
【发布时间】: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.aspxGROUP 在列表中,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


【解决方案1】:

有一个保留关键字列表,您可以在here 中找到它。将其粘贴到此答案中太长了。所有保留关键字都必须转义。在您的示例中,rollup 不是保留关键字,而 group 是。

ISO 标准中有更多的关键词。请查看同一链接中的以下注释:

此外,ISO 标准定义了保留关键字列表。避免对对象名称和标识符使用 ISO 保留关键字。 ODBC 保留关键字列表如下表所示,与 ISO 保留关键字列表相同。

ISO 标准保留关键字列表有时可能比 SQL Server 限制更多,有时限制更少。例如,ISO 保留关键字列表包含 INT。 SQL Server 不必将此区分为保留关键字。

Transact-SQL 保留关键字可用作数据库或数据库对象(如表、列、视图等)的标识符或名称。使用带引号的标识符或分隔标识符。不限制使用保留关键字作为变量名和存储过程参数名。

【讨论】:

  • 此列表还包含 Future 关键字列表,ROLLUP 也在其中。现在我明白了为什么不带括号使用 ROLLUP 不是一个好主意 - 因为它可能会从未来迁移到保留破坏现有代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
相关资源
最近更新 更多