sp_executesql で OUTPUT を取得する
sp_executesql で OUTPUT を取得する
SQL Server で動的に作成したスクリプトを実行したい時には システムストアードプロシージャの sp_executesql や EXEC (EXECUTE) ステートメント使って実行することができます。
ここでは、sp_executesql を使って、OUTPUT パラメーターの値や、結果セットを取得する方法をご紹介します。
sp_executesql で OUTPUT パラメーターの値を取得する
sp_executesql システムストアードプロシージャで動的に作成したスクリプトを実行した際に、OUTPUT パラメーターを指定して値を取得することができます。
例えば、次のような Student テーブルがあります。
Student テーブルの中の Gender が 'M' のレコード数を sp_executesql を使って OUTPUT パラメーターで取得したい時には、次のようにできます。
DECLARE @Sql NVARCHAR(500), @RecordCount INT; SET @Sql = N'SET @RecordCount = ISNULL((SELECT COUNT(*) FROM Student WHERE Gender = @Gender), 0);'; EXEC sp_executesql @Sql, N'@Gender CHAR(1), @RecordCount INT OUTPUT', @Gender = 'M', @RecordCount = @RecordCount OUTPUT; SELECT @RecordCount AS RecordCount;
このように、パラメーターの定義の箇所と、パラメータの値を指定する箇所に 出力パラメータであることを示すために OUTPUT キーワードを追加します。
Gender = 'M' のレコードは 3 つなので、@RecordCount に 3 が入っていますね。
sp_executesql で結果セットを取得する
sp_executesql を使って、Gender = 'M' のレコードの数ではなくて、Gender = 'M' のレコードを結果セットとして取得することもできます。
その際は、先に結果セットが保持できる構造を持つテーブル変数か一時テーブルを作っておく必要があります。 例えば次のような感じです。
DECLARE @MaleStudent TABLE ( StudentID INT, FirstName NVARCHAR(50), LastName NVARCHAR(50), Gender CHAR(1) ); DECLARE @Sql NVARCHAR(500); SET @Sql = N'SELECT StudentID, FirstName, LastName, Gender FROM Student WHERE Gender = @Gender;'; INSERT INTO @MaleStudent EXEC sp_executesql @Sql, N'@Gender CHAR(1)', @Gender = 'M'; SELECT * FROM @MaleStudent;
「 INSERT INTO テーブル変数(一時テーブル) EXEC sp_executesql ... 」のようにして、結果セットをテーブル変数(一時テーブル)に挿入します。
Student テーブルの Gender = 'M' のレコードが @MaleStudent に取得できていますね。
以上、sp_executesql を使って、OUTPUT パラメーターの値や、結果セットを取得する方法をご紹介しました。