Điều gì cho phép SQL Server giao dịch một tên đối tượng cho một chuỗi được truyền cho một thủ tục hệ thống


13

Điều gì gây ra nó là hợp pháp để chuyển một tên đối tượng cho thủ tục lưu trữ hệ thống sp_helptext?

Cơ chế nào chuyển đổi tên đối tượng thành một chuỗi?

ví dụ

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

Có vẻ kỳ lạ là tôi không bắt buộc phải trích dẫn tên Proc hợp lệ, trừ khi nó có .tên lược đồ và tên thủ tục tách biệt. Tôi đang tìm kiếm một lời giải thích về cách nó được tự động chuyển đổi từ một tên được trích dẫn thành một chuỗi ký tự được truyền dưới dạng giá trị của tham số.

Tôi không có một vấn đề cụ thể để giải quyết; Tôi chỉ đơn giản là tò mò về những điều không được ghi chép lại.


Đóng góp trong các ý kiến ​​đã được chuyển đến phòng chat này .
Paul White 9

Câu trả lời:


10

Đối số đầu tiên cho thủ tục lưu trữ hệ thống sp_helptextlà:

[@objname= ] 'name'
Là tên đủ điều kiện hoặc không đủ tiêu chuẩn của một đối tượng trong phạm vi lược đồ do người dùng định nghĩa. Dấu ngoặc kép chỉ được yêu cầu nếu một đối tượng đủ điều kiện được chỉ định. Nếu một tên đủ điều kiện, bao gồm tên cơ sở dữ liệu, được cung cấp, tên cơ sở dữ liệu phải là tên của cơ sở dữ liệu hiện tại. Đối tượng phải có trong cơ sở dữ liệu hiện tại. Tên là nvarchar(776), không có mặc định.

Ngoài ra, tài liệu về Định danh phân cách (Cơ sở dữ liệu) nêu rõ:

Sử dụng định danh làm tham số trong SQL Server
Nhiều thủ tục, hàm và câu lệnh DBCC được lưu trữ hệ thống lấy tên đối tượng làm tham số. Một số tham số này chấp nhận tên đối tượng nhiều phần, trong khi các tham số khác chỉ chấp nhận tên một phần. Việc một tên một phần hay nhiều phần được mong đợi sẽ xác định cách một tham số được phân tích cú pháp và sử dụng bên trong bởi SQL Server.

Tên tham số một phần
Nếu tham số là định danh một phần, tên có thể được chỉ định theo các cách sau:

  • Không có dấu ngoặc kép hoặc dấu phân cách
  • Kèm theo dấu ngoặc đơn
  • Kèm theo dấu ngoặc kép
  • Kèm trong ngoặc

Tên tham số Multipart Tên
Multipart là tên đủ điều kiện bao gồm cơ sở dữ liệu hoặc tên lược đồ và cả tên đối tượng. Khi một tên nhiều phần được sử dụng làm tham số, SQL Server yêu cầu chuỗi hoàn chỉnh tạo nên tên nhiều phần được đặt trong một tập hợp các dấu ngoặc kép.


Đối số đầu tiên sp_helptextchấp nhận cả hai tên đối tượng một phần (không đủ tiêu chuẩn) và nhiều phần (đủ điều kiện).

Nếu trình phân tích cú pháp T-SQL diễn giải mục sau sp_helptextdưới dạng tên một phần (theo bốn dấu đầu dòng ở trên), tên kết quả được truyền dưới dạng giá trị đối số (kiểu chuỗi) mà thủ tục mong đợi.

Khi trình phân tích cú pháp xem nó như một tên nhiều phần , văn bản được yêu cầu được bao quanh với các dấu ngoặc kép như đã nêu.

Tính năng chính của tên nhiều phần là .dấu phân cách (bên ngoài bất kỳ dấu phân cách nào).

Những ví dụ từ câu hỏi được diễn giải thành công dưới dạng tên một phần:

myproc - một phần (không có dấu ngoặc kép hoặc dấu phân cách - dấu đầu dòng 1)
[myproc] - một phần (trong ngoặc - dấu đầu số 4)
'myproc' - một phần (trong dấu ngoặc kép đơn - dấu đầu dòng # 2)
'dbo.myproc' - nhiều phần với các dấu ngoặc đơn được yêu cầu
[dbo.myproc] - một phần (trong ngoặc - dấu đầu số 4)

Cả hai ví dụ cuối cùng của câu hỏi đều được phân tích cú pháp dưới dạng tên tham số nhiều phần (do .dấu phân cách tiếp xúc ). Chúng tạo ra lỗi vì chúng thiếu các dấu ngoặc kép kèm theo yêu cầu:

dbo.myproc - nhiều phần không có dấu ngoặc kép đơn yêu cầu
[dbo]. [myproc] - nhiều phần không có dấu ngoặc kép đơn yêu cầu

Ví dụ thêm này sử dụng dấu ngoặc kép là thành công:

"Dbo.myproc" - một phần (trong dấu ngoặc kép - dấu đầu dòng # 3)

Lưu ý rằng nó được diễn giải thành công (đối với giá trị tham số thủ tục) là tên một phần hợp lệ , nhưng mã thủ tục có thể diễn giải chuỗi (nhiều phần) mà nó nhận được một cách linh hoạt (sử dụng PARSENAMEOBJECTID).

Là một điểm quan tâm cuối cùng, lưu ý rằng việc sử dụng dấu ngoặc kép ở đây không phụ thuộc vào cài đặt của QUOTED_IDENTIFIER.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.