Использование ключевых слов 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
Неверный синтаксис рядом с ключевым словом "группа".
Сообщение 156, уровень 15, состояние 1, строка 36
Неправильный синтаксис рядом с ключевым словом "группа".


person alpav    schedule 15.01.2014    source источник
comment
Посмотрите здесь: technet.microsoft.com/en-us/library/ms189822 .aspx GROUP есть в списке, а ROLLUP нет.   -  person PM 77-1    schedule 15.01.2014
comment
Это только мое мнение, но в целом это очень плохая практика. Моя любимая мозоль, если хотите.   -  person Dmitriy Khaykin    schedule 15.01.2014
comment
@David: почему это очень плохая практика? Мне должно быть позволено называть мои конструкции так, как мне нравится, если компилятор может устранять неоднозначность на основе синтаксиса и контекста. В противном случае я должен найти синонимы или аббревиатуры. Я бы сказал, что для компилятора очень плохая практика резервировать слова. С таким количеством зарезервированных слов в SQL становится трудно найти хорошие имена.   -  person alpav    schedule 15.01.2014
comment
Я бы также сказал, что использование непоследовательных соглашений об именах в одном языке является очень плохой практикой - некоторые имена используют символы подчеркивания, некоторые нет (есть идеи, почему?): CURRENT_DEFAULT_TRANSFORM_GROUP — какой беспорядок. Я бы без колебаний использовал в этом беспорядке любые имена, которые мне нравятся, — это не сделает его еще более беспорядочным.   -  person alpav    schedule 15.01.2014


Ответы (1)


Существует список зарезервированных ключевых слов, и вы можете найти его в здесь. Это слишком долго, чтобы вставить его в этот ответ. Все зарезервированные ключевые слова должны быть экранированы. Из вашего примера rollup не является зарезервированным ключевым словом, тогда как group является.

В стандартах ISO больше ключевых слов. Пожалуйста, ознакомьтесь со следующими примечаниями по той же ссылке:

Кроме того, стандарт ISO определяет список зарезервированных ключевых слов. Избегайте использования зарезервированных ключевых слов ISO для имен объектов и идентификаторов. Список зарезервированных ключевых слов ODBC, показанный в следующей таблице, совпадает со списком зарезервированных ключевых слов ISO.

Список зарезервированных ключевых слов стандартов ISO иногда может быть более строгим, чем SQL Server, а иногда менее строгим. Например, список зарезервированных ключевых слов ISO содержит INT. SQL Server не должен различать это ключевое слово как зарезервированное.

Зарезервированные ключевые слова Transact-SQL можно использовать в качестве идентификаторов или имен баз данных или объектов базы данных, таких как таблицы, столбцы, представления и т. д. Используйте либо идентификаторы в кавычках, либо идентификаторы с разделителями. Использование зарезервированных ключевых слов в качестве имен переменных и параметров хранимых процедур не ограничено.

person Szymon    schedule 15.01.2014
comment
Этот список также содержит список будущих ключевых слов, и в нем находится ROLLUP. Теперь я понимаю, почему не рекомендуется использовать ROLLUP без скобок, потому что он может перейти из будущего в зарезервированное, нарушая существующий код. - person alpav; 15.01.2014