システムストアドプロシージャの最初の引数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)
(プロシージャパラメータ値に対して)有効なシングルパート名として正常に解釈されますが、プロシージャコードは受け取った(マルチパート)文字列を(PARSENAME
and を使用してOBJECTID
)柔軟に解釈できることに注意してください。
最後の関心事として、ここで二重引用符を使用することはの設定に依存しないことに注意してくださいQUOTED_IDENTIFIER
。