web-dev-qa-db-ja.com

T-SQLの一時関数またはストアドプロシージャ

MS SQL 2005で一時的なストアドプロシージャまたは関数を作成する機会はありますか?このストアドプロシージャをクエリでのみ使用したいので、実行後は削除されます。

一部のデータに対して実行したいクエリがあります。しかし、このコマンドを処理するすべてのテーブルについて、その一部を変更する必要があります。したがって、私は一時的なSPを作成し、提供する引数(テーブル名など)からクエリを返す)を作成し、このクエリをEXECで実行すると思いました。

そして、このストアドプロシージャは後で私にとっては役に立たないので、一時的にして、クエリの実行を終了すると消えるようにしたいと思います。

35

編集について-TSQLを含む(パラメータ化された)nvarcharに対してsp_ExecuteSQLを使用する必要があるようです。

Sp_ExecuteSQLで検索します。簡単な例:

DECLARE @SQL nvarchar(4000),
 @Table varchar(20) = 'ORDERS',
 @IDColumn varchar(20) = 'OrderID',
 @ID int = 10248

 SET @SQL = 'SELECT * FROM [' + @Table + '] WHERE ['
  + @IDColumn + '] = @Key'

  EXEC sp_executesql @SQL, N'@Key int', @ID

テーブル名と列名はクエリに連結する必要がありますが、値(@Keyなど)はパラメータ化できます。


一時的なストアドプロシージャがありますが、spごとではなく、接続ごとです。

ただし、共通テーブル式を確認することをお勧めします-それらはあなたが求めているものかもしれません(ただし、それらから一度しか読み取ることができません)。

たぶん、あなたが何をしようとしているのかを明確にすることができればdo

27
Marc Gravell

この質問は少し古いですが、他の回答は一時的なプロシージャを作成するための構文を提供できませんでした。構文は一時テーブルの場合と同じです:ローカル一時オブジェクトの#name、グローバル一時オブジェクトの## name。

CREATE PROCEDURE #uspMyTempProcedure AS
BEGIN
  print 'This is a temporary procedure'
END

これは公式ドキュメントの「プロシージャ名」セクションで説明されています。 http://technet.Microsoft.com/en-us/library/ms187926%28v=sql.90%29.aspx

この手法を使用して、プリミティブT-SQLユニットテストのコードを重複排除しています。実際の単体テストフレームワークの方が優れていますが、これは何も実行せず、「ガベージコレクション」自体を実行するよりも優れています。

30
ensslen