Что делает законным передачу имени объекта системной хранимой процедуре sp_helptext
?
Какой механизм преобразует имя объекта в строку?
например
-- works
sp_helptext myproc
sp_helptext [myproc]
sp_helptext [dbo.myproc]
-- and behaves the same as a string
sp_helptext 'myproc'
sp_helptext 'dbo.myproc'
-- does not work
sp_helptext dbo.myproc -- Msg 102, Level 15, State 1, Line 1 incorrect syntax near '.'
-- an additional case that does not work.
sp_helptext [dbo].[myproc] -- Msg 102, Level 15, State 1, Line 1 incorrect syntax
Кажется странным, что я не обязан заключать в кавычки действительные имена процедур, если только у них нет .
разделяющего имени схемы и имени процедуры. Я ищу объяснение того, как он автоматически конвертируется из имени в кавычках в строковый литерал для передачи в качестве значения параметра.
У меня нет конкретной проблемы для решения; Я просто интересуюсь вещами, которые не задокументированы.
Ответы:
Первый аргумент системной хранимой процедуры
sp_helptext
:Кроме того, документация для идентификаторов с разделителями (компонент Database Engine) гласит:
Первый аргумент
sp_helptext
принимает как однокомпонентные (неквалифицированные), так и составные (квалифицированные) имена объектов.Если анализатор T-SQL интерпретирует элемент после
sp_helptext
как однокомпонентное имя (в соответствии с четырьмя пунктами выше), полученное имя передается как значение аргумента (строковый тип), ожидаемое процедурой.Когда синтаксический анализатор видит его как составное имя , текст должен быть заключен в одинарные кавычки, как указано.
Ключевой особенностью составного имени является
.
разделитель (вне каких-либо разделителей).Эти примеры из вопроса успешно интерпретируются как однокомпонентные имена:
Последние два примера из вопроса оба анализируются как составные имена параметров (из-за открытого
.
разделителя). Они выдают ошибку, потому что им не хватает обязательных одинарных кавычек:Этот дополнительный пример с использованием двойных кавычек успешен:
Обратите внимание, что оно успешно интерпретируется (для значения параметра процедуры) как допустимое однокомпонентное имя, но код процедуры способен гибко интерпретировать (составную) строку, которую он получает (используя
PARSENAME
иOBJECTID
).В качестве последнего интереса отметим, что использование двойных кавычек здесь не зависит от настройки
QUOTED_IDENTIFIER
.источник