3

アプリケーションで使用される SQL サーバーに既存のビューがあります。ストアド プロシージャから返されたテーブルと結合する必要があります。ストアド プロシージャは、結果を返す前に複数の #temp テーブルに挿入するなど、多くのことを行います。

ストアド プロシージャをテーブル値関数に変換しようとしました。ただし、TVF 内の一時テーブルに挿入すると、コンパイル エラーが発生します。

これを達成できる他の方法はありますか?

ありがとう

4

3 に答える 3

3

ストアド プロシージャからの結果を一時テーブルに挿入し、それをビューに結合できます。

以下の例を見てください

SQL フィドルのデモ

CREATE TABLE TADA(
  ID INT
);
INSERT INTO TADA VALUES (1),(2);

CREATE VIEW vw_TADA
AS
SELECT *
FROM TADA
WHERE ID <= 1;

CREATE PROCEDURE sp_TADA
AS
SELECT *
FROM TADA
WHERE ID > 1;

CREATE TABLE #TADA(
  ID INT
)
INSERT INTO #TADA EXEC sp_TADA

SELECT *
FROM vw_TADA
UNION ALL
SELECT *
FROM #TADA
于 2013-08-07T12:43:57.440 に答える
0

もう 1 つのトリックは、 を使用することOPENQUERYです。ここでの私の答えから

プロパティが true に設定されOPENQUERYたループバック リンク サーバーを使用する必要があります。すでに有効なサーバーがあるかどうかを'DATA ACCESS'確認できますが、手動で.sys.serversloopback

EXEC master..sp_addlinkedserver 
    @server = 'loopback',  
    @srvproduct = '',
    @provider = 'SQLNCLI',
    @datasrc = @@SERVERNAME;

EXEC master..sp_serveroption 
    @server = 'loopback', 
    @optname = 'DATA ACCESS',
    @optvalue = 'TRUE';

これをリンク サーバーとしてクエリできるようになったので、任意のクエリ (ストアド プロシージャの呼び出しを含む) の結果を通常の として使用できますSELECT。したがって、これを行うことができます (データベースのプレフィックス重要であることに注意してください。そうしないと、エラー 11529 および 2812 が発生します)。

SELECT * FROM OPENQUERY(loopback, 'EXEC db.dbo.procedure;') AS x;

これで、ビューに参加できます。

しかし、手順を TVF として書き直し、ロジックで #temp テーブルを使用するのをやめた方が良いと正直に感じています。上記は現在のインスタンスで機能する可能性がありますが、SQL Server 2012 では機能しません (手順の #temp テーブルのためにメタデータを特定できません)。また、特定のデータベースまたはサーバーがある場合は機能しません。レベルの DDL は、(同じタイプの理由で) いずれかをトリガーします。

その他の情報と制限については、 http://www.sommarskog.se/share_data.html#OPENQUERYも参照してください。

于 2013-08-07T12:48:15.657 に答える