この記事では、T-SQLを使用してSQLServerのストアドプロシージャの定義を取得する4つの方法を紹介します。
定義は、ストアドプロシージャの作成に使用される実際のT-SQLステートメントです。
ここでの3つのメソッドは、ビューの定義を返すために使用されるメソッドとまったく同じです(ただし、ここを除いて、ビューではなくストアドプロシージャで使用されています)。
例1-sys.sql_modulesシステムカタログビュー
sys.sql_modules
システムカタログビューは、SQLServerのSQL言語定義モジュールである各オブジェクトの行を返します。
つまり、このビューを使用して、関数、ビュー、そしてもちろんストアドプロシージャなど、さまざまなタイプのオブジェクトに関する情報を返すことができます。
このビューで返される列の1つは、definition
と呼ばれます。 。名前が示すように、これはオブジェクトの定義を返します。
SELECT definition FROM sys.sql_modules WHERE object_id = object_id('uspGetAlbumsByArtist');
結果:
+--------------+ | definition | |--------------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [dbo].[Albums] WHERE ArtistId = @ArtistId | +--------------+
この例ではコマンドラインインターフェイス(CLI)を使用したため、結果は適切にフォーマットされています。
GUI(SSMSやAzure Data Studioなど)を使用して結果をグリッドで返す場合、定義は1つのセルの1つの長い行で返される可能性があります。このような場合、より読みやすい形式で表示したい場合は、追加の作業を行う必要があります。または、sp_helptext
を使用することもできます 以下の方法。
例2–sp_helptextシステムストアドプロシージャ
ストアドプロシージャの定義を返す別の方法は、sp_helptext
を使用することです。 システムストアドプロシージャ。 (暗号化されていない)ストアドプロシージャの定義を返すだけでなく、ユーザー定義のルール、デフォルト、ビュー、ユーザー定義のTransact-SQL関数、トリガー、計算列、CHECK
制約、またはシステムストアドプロシージャなどのシステムオブジェクト。
このストアドプロシージャは、複数の行にまたがる定義を表示します。各行には、255文字のT-SQL定義が含まれています。
例:
EXEC sp_helptext 'uspGetAlbumsByArtist';
GUI(Azure Data Studio)を使用したときに得られる結果は次のとおりです。
コマンドラインインターフェイスを使用すると、次のようになります。
+--------+ | Text | |--------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS | | SELECT AlbumName | | FROM [dbo].[Albums] | | WHERE ArtistId = @ArtistId | +--------+
例3– OBJECT_DEFINITION()関数
ストアドプロシージャの定義を返す別の方法は、OBJECT_DEFINITION()
を使用することです。 働き。以前のメソッドと同様に、このメソッドは他のオブジェクトタイプの定義を返すこともできます。
この関数の使用例は次のとおりです。
SELECT OBJECT_DEFINITION( OBJECT_ID('uspGetAlbumsByArtist') ) AS [Definition];
結果:
+--------------+ | definition | |--------------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [dbo].[Albums] WHERE ArtistId = @ArtistId | +--------------+
例4–ROUTINESシステム情報スキーマビュー
ROUTINES
システム情報スキーマビューは、ストアドプロシージャ(および関数も)の定義を返すこともできます。
このビューは多くの列を返しますが、そのうちの1つはオブジェクトの定義です。したがって、その列に名前を付けて、定義だけを返すことができます。
SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'uspGetAlbumsByArtist';
結果:
+----------------------+ | ROUTINE_DEFINITION | |----------------------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [dbo].[Albums] WHERE ArtistId = @ArtistId | +----------------------+
ROUTINE_DEFINITION
に注意してください このシステムビューの列の最大長はnvarchar(4000) 。これより大きい定義の場合は、OBJECT_DEFINITION()
を使用できます。 関数またはsys.sql_modules
前の例で表示します。どちらもnvarchar(max)を使用します 定義については、ROUTINE_DEFINITION
の文字制限はありません。 列(前述のとおり、 nvarchar(4000) 。