Что именно делает зарезервированное слово T-SQL LineNo?

Сегодня я писал запрос к таблице в окне SQL Server 2000, и при написании запроса в Query Analyzer, к своему удивлению, я заметил, что слово LineNo было преобразовано в синий текст.

Похоже, что это зарезервированное слово согласно MSDN. документации, но я не могу найти никакой информации о нем, просто предполагаю, что это может быть устаревшее зарезервированное слово, которое ничего не делает.

У меня нет проблем с экранированием имени поля, но мне любопытно - кто-нибудь знает, для чего на самом деле используется «LineNo» в T-SQL?


person LittleBobbyTables - Au Revoir    schedule 29.10.2010    source источник


Ответы (2)


Хорошо, это полностью недокументировано, и мне пришлось выяснить это методом проб и ошибок, но он устанавливает номер строки для сообщения об ошибках. Например:

LINENO 25

SELECT * FROM NON_EXISTENT_TABLE

Приведенное выше даст вам сообщение об ошибке, указывающее на ошибку в строке 27 (вместо 3, если вы преобразуете строку LINENO в однострочный комментарий (например, поставив перед ней два дефиса)):

Msg 208, Level 16, State 1, Line 27
Invalid object name 'NON_EXISTENT_TABLE'.

Это связано с аналогичными механизмами в языках программирования, такими как директивы препроцессора #line в Visual C ++ и Visual C # (которые, кстати, задокументированы).

Вы спросите, чем это полезно? Что ж, одно его использование, чтобы помочь генераторам кода SQL, которые генерируют код на языке более высокого уровня (чем SQL) и / или выполняют расширение макроса, связывать сгенерированные строки кода со строками кода пользователя.

P.S. Не стоит полагаться на недокументированные функции, особенно при работе с базой данных.

Обновление: это объяснение по-прежнему верно до текущей версии SQL Server включительно, которая на момент написания этой статьи является накопительным обновлением 5 для SQL Server 2008 R2 (10.50.1753.0).

person Michael Goldshteyn    schedule 29.10.2010
comment
Это фантастика - я бы дал вам еще 2 голоса за хороший ответ, если бы мог. Я хотел бы отметить, что он не работает в самом Query Analyzer, но работает так же, как описано в хранимой процедуре. Мы должны использовать эту возможность только во благо, а не для того, чтобы возиться с администраторами баз данных ... - person LittleBobbyTables - Au Revoir; 29.10.2010
comment
Нет, давайте облажаться с администраторами баз данных :-) Сообщение 208, уровень 16, состояние 1, строка 2792874 - person Stephen Turner; 29.10.2010
comment
... и до сих пор не документирован. - person Michael Goldshteyn; 02.10.2012
comment
Я поднял ошибку с MS, посмотрим, как далеко она зайдет. Вероятно, он будет отклонен как «По замыслу» connect.microsoft.com/SQLServer/feedback/ подробнее / 1426523 - person Martin Brown; 12.06.2015
comment
Есть ли способ вернуть белье? - person JJS; 19.05.2016
comment
Теперь это задокументировано msdn.microsoft.com/en -us / library / aa977931 (v = vs.71) .aspx - person Jmaurier; 14.06.2017
comment
@Jmaurier Это для FoxPro, а не для T-SQL. И его поведение отличается от поведения LINENO T-SQL. - person binki; 10.07.2017
comment
Это еще одна неприятная ошибка, когда не указывается, что LineNo - это зарезервированное слово, которое нельзя использовать в операторе SQL. Я потратил часы, чтобы понять это! - person Yu Shen; 22.02.2018
comment
ВАУ! ... Вы потратили часы, чтобы понять это? Тот факт, что он отображается в цвете зарезервированного слова, не был достаточно существенной информацией, чтобы дать вам понять, что его нужно заключить в скобки, чтобы использовать? - person Jeff Moden; 29.08.2019

В зависимости от того, где вы его используете, вы всегда можете использовать [LineNo]. Например:

select LnNo [LineNo] from OrderLines.
person Joakim Lundvall    schedule 17.07.2018
comment
Это не ответ на вопрос. - person Dale K; 10.10.2019