Що дозволяє SQL Server торгувати іменем об'єкта для рядка, переданого до системної процедури


13

Що обумовлює правомірність передавання імені об'єкта в систему, що зберігається 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

Здається дивним, що мені не потрібно вказувати єдині цитати дійсних імен PROC, якщо вони не мають .роздільної назви схеми та назви процедури. Я шукаю пояснення того, як воно автоматично перетворюється з імені котирується в літеральний рядок, який передається як значення параметра.

У мене немає конкретного питання, яке потрібно вирішити; Я просто допитливий щодо речей, які не документально підтверджені.


Відповіді:


10

Перший аргумент до системної збереженої процедури sp_helptext:

[@objname= ] 'name'
Це кваліфіковане або некваліфіковане ім'я визначеного користувачем об'єкта, нанесеного на схему. Лапки потрібні, лише якщо вказано кваліфікований об'єкт. Якщо надано повністю кваліфіковане ім’я, включаючи ім'я бази даних, ім'я бази даних повинно бути іменем поточної бази даних. Об'єкт повинен бути в поточній базі даних. назва - nvarchar(776)без замовчування.

Крім того, у документації для розділених ідентифікаторів (двигуна бази даних) зазначено:

Використання ідентифікаторів як параметрів у SQL Server
Багато системних збережених процедур, функцій та операторів DBCC приймають назви об'єктів як параметри. Деякі з цих параметрів приймають імена об'єктів з кількома частинами, а інші приймають лише імена з частинами. Чи очікується ім'я з однієї частини або з декількох частин, визначає, як параметр аналізує та використовує внутрішньо SQL Server.

Одночастинні імена параметрів
Якщо параметр є ідентифікатором однієї частини, ім'я можна вказати наступними способами:

  • Без лапок чи роздільників
  • Укладені в єдині лапки
  • Укладений у подвійні лапки
  • Укладений у дужки

Імена параметрів мультичастин Імена
багаточастин - це кваліфіковані імена, які містять ім’я бази даних чи схеми, а також ім'я об'єкта. Коли в якості параметра використовується ім'я з декількома частинами, SQL Server вимагає, щоб повний рядок, що складається з імені багаточастин, був укладений у набір одиничних лапок.


Перший аргумент sp_helptextприймає як одночастинні (некваліфіковані), так і багаточастинні (кваліфіковані) імена об'єктів.

Якщо аналізатор T-SQL інтерпретує елемент після sp_helptextяк ім'я однієї частини (відповідно до чотирьох точок кулі вище), отримане ім'я передається як значення аргументу (типу рядка), очікуваного процедурою.

Коли аналізатор сприймає це як багаточастинне ім'я , текст повинен бути оточений окремими лапками, як зазначено.

Основна особливість імені багаточастин - .роздільник (поза будь-якими роздільниками).

Ці приклади із запитання успішно інтерпретуються як назви з частинами:

myproc - односкладова (без лапок чи роздільників - куля №1)
[myproc] - односкладова (у дужках - куля №4)
'myproc' - односкладова (в одних лапках - куля №2)
'dbo.myproc' - багаточастинка з необхідними єдиними лапками
[dbo.myproc] - односкладова (у дужках - куля №4)

Останні два приклади із запитання аналізуються як багаточастинні назви параметрів (через відкритий .роздільник). Вони створюють помилку, оскільки їм не вистачає необхідних доданих єдиних лапок:

dbo.myproc - багаточастковий без необхідних єдиних лапок
[dbo]. [myproc] - багаточастинка без необхідних єдиних лапок

Цей додатковий приклад використання подвійних лапок є вдалим:

"dbo.myproc" - односкладова (у подвійних лапках - куля №3)

Зауважте, що він успішно інтерпретується (для параметра параметра процедури) як дійсне ім'я з однієї частини , але код процедури здатний гнучко інтерпретувати (багаточастинний) рядок, який він отримує (використовуючи PARSENAMEта OBJECTID).

В якості кінцевої цікавинки зауважте, що використання подвійних лапок тут не залежить від налаштування QUOTED_IDENTIFIER.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.