SQL Serverの場合、ストアドプロシージャから結果のデータを取得し、それを別のクエリで使用するために一時テーブルに挿入したい場合があります。このタスクを実行する方法を決定するのはやや難しい場合があるため、特定のニーズとデータベース構成に応じて、いくつかのオプションの概要を簡単に説明します。
特定の方法を検討する前に、手順の例を作成しましょう。特に便利ではありませんが、BooksByPrimaryAuthor
を作成しましょう。 @PrimaryAuthor
を受け入れるプロシージャ パラメータを設定し、books
からレコードを取得します その@PrimaryAuthor
のテーブル 一致します。プロシージャ生成ステートメントは次のようになります。
CREATE PROC BooksByPrimaryAuthor
@PrimaryAuthor nvarchar(100)
AS
BEGIN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
END
GO
理想的には、このようなことを行いたいのですが、ここでSELECT
プロシージャから得られたデータを一時テーブルに挿入します:
SELECT
*
INTO
#tmpSortedBooks
FROM
EXEC BooksByPrimaryAuthor 'Tolkien'
問題は、上記の構文が不適切で機能しないことです。 。新しい方法が必要です。
OPENROWSETステートメントの使用
1つの可能性は、OPENROWSET
を使用することです。 ステートメント。OLEDBソースからリモートデータにアクセスでき、実行できます。 別のSQLステートメント内から直接。 OPENROWSET
は1回限りの接続とデータ取得の方法であるため、頻繁な接続には使用しないでください(その場合はサーバーをリンクすることをお勧めします)。
OPENROWSET
任意のINSERT
のターゲットにすることができます 、DELETE
、またはUPDATE
ステートメント。これは、ストアドプロシージャを「実行」し、そのデータを待機中の一時テーブルに抽出するという目的に最適です。
OPENROWSET
を使用する前に 、特にアドホックアクセスを許可することにより、一部の構成オプションを変更する必要がある場合があります。これは、次のステートメントを使用して構成できます。
sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
これで、OPENROWSET
を利用できます 、準拠する必要のある特定の構文があります:
OPENROWSET(
<PROVIDER_NAME>,
<DATA_SOURCE>,
<OPTIONS>
)
したがって、OPENROWSET
を介してストアドプロシージャを実行できます。 次のように一時テーブルに渡します:
SELECT
*
INTO
#tmpSortedBooks
FROM
OPENROWSET(
'SQLNCLI',
'Server=(local)\SQL2008;Trusted_Connection=yes;',
'EXEC BooksByPrimaryAuthor Tolkien'
)
PROVIDER_NAME
を変更する必要がある場合があります およびDATA_SOURCE
自分の目的のための値。
OPENROWSET
にはいくつかの欠点があります メソッド、つまり、上記で見たようにアドホックなアクセス許可/構成が必要であり、OPENROWSET
は単一の結果セットのみを返すことができます(複数のセットが提供されている場合は、最初の結果セットのみが返されます)。
したがって、このタスクを実行する別の方法は、代わりにストアドプロシージャをユーザー定義関数に効果的に置き換えることです。
この例では、次のようになります。
CREATE FUNCTION BooksByPrimaryAuthor
(
@PrimaryAuthor nvarchar(100)
)
RETURNS TABLE
AS
RETURN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
GO
この関数は、OPENROWSET
を使用して、上記とほぼ同じ方法で使用できます。 :
SELECT
*
INTO
#tmpSortedBooks
FROM
BooksByPrimaryAuthor('Tolkien')
本当にストアドプロシージャが必要な場合は、関数をストアドプロシージャ内にラップすることもできます。