Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL关键字作为不带括号的名称_Sql_Sql Server 2008_Keyword_Naming_Brackets - Fatal编程技术网

使用SQL关键字作为不带括号的名称

使用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

哪些关键字可以用作无括号的名称,哪些不可以

为什么有些SQL关键字可以用作名称,而其他关键字则不能用作名称? 在确定哪些模式我可以使用,哪些模式我不能使用时不尝试编译并出错,这有什么模式吗

我的印象是不允许使用较旧的关键字,但允许使用较新的关键字,以便较新的SQL版本与较旧的SQL版本尽可能兼容

在下面的示例中,rollup可以用作不带括号的名称,但group不能

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组-真是一团糟。我会毫不犹豫地在这个混乱中使用任何我喜欢的名字——这不会让它变得更混乱。这个列表还包含了未来关键词的列表,汇总就在其中。现在我明白了为什么使用不带括号的汇总不是一个好主意,因为它可能会从未来迁移到现有代码。