私は次のように動作するようになっているストアドプロシージャがあります。ストアドプロシージャの複数の呼び出しの結果を統合する方法は?
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を使うことができます。
使用しているSQL Serverのバージョンは? – Coder1991
SQL Server 2016標準エディション – Hydrargyrum
http://www.sommarskog.se/share_data.html – user6144226