アプリケーションで使用される SQL サーバーに既存のビューがあります。ストアド プロシージャから返されたテーブルと結合する必要があります。ストアド プロシージャは、結果を返す前に複数の #temp テーブルに挿入するなど、多くのことを行います。
ストアド プロシージャをテーブル値関数に変換しようとしました。ただし、TVF 内の一時テーブルに挿入すると、コンパイル エラーが発生します。
これを達成できる他の方法はありますか?
ありがとう
アプリケーションで使用される SQL サーバーに既存のビューがあります。ストアド プロシージャから返されたテーブルと結合する必要があります。ストアド プロシージャは、結果を返す前に複数の #temp テーブルに挿入するなど、多くのことを行います。
ストアド プロシージャをテーブル値関数に変換しようとしました。ただし、TVF 内の一時テーブルに挿入すると、コンパイル エラーが発生します。
これを達成できる他の方法はありますか?
ありがとう
ストアド プロシージャからの結果を一時テーブルに挿入し、それをビューに結合できます。
以下の例を見てください
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
もう 1 つのトリックは、 を使用することOPENQUERY
です。ここでの私の答えから:
プロパティが true に設定されOPENQUERY
たループバック リンク サーバーを使用する必要があります。すでに有効なサーバーがあるかどうかを'DATA ACCESS'
確認できますが、手動で.sys.servers
loopback
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も参照してください。