สิ่งที่ทำให้ 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 ที่ถูกต้องเพียงครั้งเดียวเว้นแต่จะมี.ชื่อสคีมาและชื่อโพรซีเดอร์ที่แยกออกมา ฉันกำลังหาคำอธิบายว่ามันได้รับการแปลงโดยอัตโนมัติจากชื่อที่ยกมาเป็นตัวอักษรสตริงที่จะส่งผ่านเป็นค่าของพารามิเตอร์

ฉันไม่มีปัญหาเฉพาะในการแก้ไข; ฉันเพียงแค่อยากรู้อยากเห็นเกี่ยวกับสิ่งที่ไม่ได้จัดทำเป็นเอกสาร


การบริจาคในความคิดเห็นถูกย้ายไปที่ห้องแชทนี้
Paul White 9

คำตอบ:


10

อาร์กิวเมนต์แรกของโพรซีเดอร์ที่เก็บระบบsp_helptextคือ:

[@objname= ] 'name'
เป็นชื่อที่ผ่านการรับรองหรือไม่ผ่านการรับรองของวัตถุที่กำหนดโดยผู้ใช้กำหนดขอบเขตด้วยสกีมา จำเป็นต้องใช้เครื่องหมายใบเสนอราคาเฉพาะถ้ามีการระบุวัตถุที่ผ่านการรับรอง หากระบุชื่อแบบเต็มรวมถึงชื่อฐานข้อมูลชื่อฐานข้อมูลต้องเป็นชื่อของฐานข้อมูลปัจจุบัน วัตถุต้องอยู่ในฐานข้อมูลปัจจุบัน ชื่อคือnvarchar(776)ไม่มีค่าเริ่มต้น

นอกจากนี้เอกสารสำหรับสถานะตัวคั่น (ฐานข้อมูล Engine):

การใช้ตัวระบุเป็นพารามิเตอร์ใน SQL Server
ระบบที่จัดเก็บขั้นตอนฟังก์ชั่นและคำสั่ง DBCC ใช้ชื่อวัตถุเป็นพารามิเตอร์ พารามิเตอร์เหล่านี้บางตัวยอมรับชื่อวัตถุหลายส่วนในขณะที่คนอื่นยอมรับเฉพาะชื่อส่วนเดียวเท่านั้น คาดว่าชื่อส่วนเดียวหรือหลายส่วนจะเป็นตัวกำหนดว่าพารามิเตอร์จะแยกวิเคราะห์และใช้ภายในโดย SQL Server หรือไม่

ชื่อ
พารามิเตอร์แบบส่วนเดียวหากพารามิเตอร์เป็นตัวระบุส่วนเดียวชื่อสามารถระบุได้ด้วยวิธีการดังต่อไปนี้:

  • ไม่มีเครื่องหมายคำพูดหรือตัวคั่น
  • อยู่ในเครื่องหมายคำพูดเดี่ยว
  • อยู่ในเครื่องหมายคำพูดคู่
  • ล้อมรอบด้วยวงเล็บ

ชื่อพารามิเตอร์
หลายส่วนชื่อหลายส่วนเป็นชื่อที่มีคุณสมบัติซึ่งรวมถึงฐานข้อมูลหรือชื่อสคีมาและชื่อวัตถุ เมื่อชื่อ multipart ถูกใช้เป็นพารามิเตอร์ SQL Server ต้องการให้สตริงสมบูรณ์ที่ประกอบเป็นชื่อ multipart จะอยู่ในชุดของเครื่องหมายคำพูดเดี่ยว


อาร์กิวเมนต์แรกที่sp_helptextยอมรับทั้งชื่อวัตถุส่วนเดียว (ไม่ผ่านการรับรอง) และหลายส่วน (ผ่านการรับรอง)

หากตัวแยกวิเคราะห์ T-SQL ตีความรายการหลังจากsp_helptextเป็นชื่อส่วนเดียว (ตามด้วยสัญลักษณ์แสดงหัวข้อย่อยสี่จุดด้านบน) ชื่อผลลัพธ์จะถูกส่งผ่านเป็นค่าอาร์กิวเมนต์ (ชนิดสตริง) ที่คาดไว้โดยขั้นตอน

เมื่อ parser เห็นว่าเป็นชื่อหลายส่วนข้อความจะต้องล้อมรอบด้วยเครื่องหมายอัญประกาศเดี่ยวตามที่ระบุไว้

คุณสมบัติหลักของชื่อหลายส่วนคือ.ตัวคั่น (นอกตัวคั่นใด ๆ )

ตัวอย่างจากคำถามเหล่านี้แปลเป็นชื่อส่วนเดียวสำเร็จแล้ว:

myproc - ส่วนเดียว (ไม่มีเครื่องหมายคำพูดหรือตัวคั่น - bullet # 1)
[myproc] - ส่วนเดียว (ในวงเล็บ - กระสุน # 4)
'myproc' - ส่วนเดียว (ในเครื่องหมายคำพูดเดี่ยว - กระสุน # 2)
'dbo.myproc' - หลายส่วนด้วยเครื่องหมายอัญประกาศเดี่ยวที่ต้องการ
[dbo.myproc] - ส่วนเดียว (ในวงเล็บ - กระสุน # 4)

ตัวอย่างสองคำถามสุดท้ายจากคำถามถูกแยกวิเคราะห์เป็นชื่อพารามิเตอร์หลายส่วน (เนื่องจาก.ตัวคั่นที่เปิดเผย) พวกเขาสร้างข้อผิดพลาดเนื่องจากไม่มีเครื่องหมายคำพูดเดี่ยวล้อมรอบ:

dbo.myproc - หลายส่วนโดยไม่ต้องใส่เครื่องหมายคำพูดเดี่ยว
[dbo]. [myproc] - หลายส่วนโดยไม่มีเครื่องหมายคำพูดเดี่ยวที่จำเป็น

ตัวอย่างพิเศษนี้โดยใช้เครื่องหมายคำพูดคู่สำเร็จแล้ว:

"dbo.myproc" - ส่วนเดียว (ในเครื่องหมายคำพูดคู่ - สัญลักษณ์หัวข้อ # 3)

โปรดทราบว่าสามารถตีความได้สำเร็จ (สำหรับค่าพารามิเตอร์โพรซีเดอร์) เป็นชื่อส่วนที่ถูกต้องแต่โค้ดโพรซีเดอร์สามารถตีความสตริง (หลายส่วน) ที่ได้รับความยืดหยุ่น (โดยใช้PARSENAMEและOBJECTID)

QUOTED_IDENTIFIERเป็นจุดสุดท้ายที่สนใจทราบว่าการใช้เครื่องหมายอัญประกาศที่นี่ไม่ได้ขึ้นอยู่กับการตั้งค่าของ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.