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パーサーが(上記の4つの箇条書きに従って)後の項目を単一部分の名前sp_helptextとして解釈する場合、結果の名前は、プロシージャで予期される(文字列型)引数値として渡されます。

パーサーがそれをマルチパート名と見なす場合、テキストは、記載されているように単一引用符で囲む必要があります。

マルチパート名の重要な機能は、.区切り文字(区切り文字の外側)です。

質問からのこれらの例は、単一部分の名前として正常に解釈されます。

myproc-シングルパート(引用符または区切り文字なし-箇条書き#1)
[myproc]-シングルパート(カッコ内-箇条書き#4)
'myproc'-単一部分(単一引用符で囲む-箇条書き#2)
'dbo.myproc'- 必要な単一引用符を含むマルチパート
[dbo.myproc]-シングルパート(カッコ内-箇条書き#4)

質問の最後の2つの例は、両方ともマルチパートパラメーター名として解析されます(公開された.セパレーターのため)。単一引用符で囲む必要がないため、エラーが発生します。

dbo.myproc-必要な単一引用符なしのマルチパート
[dbo]。[myproc]-必要な単一引用符なしのマルチパート

二重引用符を使用したこの追加の例は成功します。

"dbo.myproc"-シングルパート(二重引用符で囲み-箇条書き#3)

(プロシージャパラメータ値に対して)有効なシングルパート名として正常に解釈されますが、プロシージャコードは受け取った(マルチパート)文字列を(PARSENAMEand を使用してOBJECTID)柔軟に解釈できることに注意してください。

最後の関心事として、ここで二重引用符を使用することはの設定に依存しないことに注意してくださいQUOTED_IDENTIFIER

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.