sql >> データベース >  >> RDS >> Sqlserver

ストアドプロシージャの結果をSQLServerの一時テーブルに挿入する方法

    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')
    

    本当にストアドプロシージャが必要な場合は、関数をストアドプロシージャ内にラップすることもできます。


    1. SQLServerのワークロードを理解する

    2. SQL INSERTクエリに重複レコードを挿入しないようにする方法(5つの簡単な方法)

    3. SQL Serverで「smalldatetime」を「time」に変換する(T-SQLの例)

    4. OracleデータベースのINDICES-OFバインド句を含むFORALLステートメント