2017-07-05 14 views
1

私は次のように動作するようになっているストアドプロシージャがあります。ストアドプロシージャの複数の呼び出しの結果を統合する方法は?

DECLARE @TagNames AS TABLE 
(
    tag NVARCHAR(50) NOT NULL 
) 

-- Get list of tags 
INSERT INTO @TagNames 
SELECT tag 
FROM tagTable 
WHERE tag LIKE @tagPattern 

-- Create unified result set, combining results from stored proc for each tag 
SELECT n.tag, r.time, r.value FROM @TagNames AS n 
CROSS APPLY 
    dbo.GetResultsForTag(n.tag) AS r -- Not valid 

しかし、私はdbo.GetResultsForTag()は、ストアドプロシージャであるため、CROSSは適用され使用することはできませんが。

dbo.GetResultsForTag()の実装では、リンクされたサーバーに渡される動的SQLのEXECを呼び出しているため、テーブル値関数に変換することはできません。動的SQLは、テーブル値関数では使用できません。

リンクサーバーはOLE-DBプロバイダー経由で通信しますが、SQL Serverインスタンスではありません。 OSISoft PIプロセスの履歴データベースです。通常、単一のクエリでデータの複数のタグを照会するのは非常に簡単ですが、この場合は単一のタグ名を指定するフィルタ式を指定する必要がある計算が行われます。したがって、各タグにはデータソースに対する個別のクエリが必要です。

私が知る限り、ストアドプロシージャはJOINの右側として使用できません。

これらの結果をまとめて整理するための他の選択肢は何ですか?ちょうどカーソル?


編集:ダイナミックSQLとストアドプロシージャを使用することになっていた障害を修正する方法を知りました。これでストアドプロシージャの代わりにテーブル値関数を使用できる正規のSQLを使うことができます。これは、醜いカーソルハッキングの代わりにJOINとCROSS APPLYを使うことができます。

+0

使用しているSQL Serverのバージョンは? – Coder1991

+0

SQL Server 2016標準エディション – Hydrargyrum

+1

http://www.sommarskog.se/share_data.html – user6144226

答えて

1

保存されたprocをテーブル値関数として書き換えますか?

また、フィルターを外してテーブル(多分一時テーブル)にダンプしてからそれに参加してください。

+0

リモートデータソースでクエリを構築するために動的SQLを使用する必要があるため、テーブル値関数として書くことはできません。また、リモートクエリがタグなしで有効でないため、タグ名フィルタをリモートクエリから削除することもできません。 – Hydrargyrum

+0

タイマーでリモートクエリを実行して、すべてのタグをSQLにプルし、そのデータの結合/ TVFを実行するのはどうしてですか...毎回リモートクエリを行うのは意味がありません。 – Milney

+0

GetResultsForTagストアドプロシージャPIサーバーに生データの計算を実行し、その結果を私に返します。私は、リモートクエリプロセッサの設計のために、一度に1つのタグに対してのみ行うことができます - 基本的に、私は文字列値としてフィルタ式を渡す必要がある機能を使用しており、その式にはタグ名も含まれています。私はむしろ、(もっと大きな)生データをネットワーク上で移動したり、計算を再実装したりするのではないでしょうか。 – Hydrargyrum

関連する問題