2017-07-05 3 views
1

Ich habe eine gespeicherte Prozedur, die funktionieren soll wie folgt:Wie konsolidiere ich Ergebnisse aus mehreren Aufrufen einer gespeicherten Prozedur?

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 

Allerdings kann ich nicht CROSS APPLY verwenden, da dbo.GetResultsForTag() eine gespeicherte Prozedur ist.

Die Implementierung von dbo.GetResultsForTag() beruht auf dem Aufruf EXEC auf dynamischen SQL an einen Verbindungsserver übergeben, so dass ich glaube, es kann nicht in eine Tabellenwertfunktion umgewandelt werden. Dynamisches SQL ist in Tabellenfunktionen nicht zulässig.

Der Verbindungsserver kommuniziert über einen OLE-DB-Anbieter, aber es handelt sich nicht um eine SQL Server-Instanz. Es ist eine OSISoft PI Prozess Historian Datenbank. Normalerweise ist es ziemlich einfach, mehrere Daten-Tags in einer einzigen Abfrage abzufragen, aber in diesem Fall mache ich ein paar Berechnungen, bei denen ich einen Filterausdruck angeben muss, der einen einzelnen Tag-Namen angibt. Daher benötigt jedes Tag eine separate Abfrage an die Datenquelle.

Soweit ich weiß, können gespeicherte Prozeduren nicht als die rechte Seite eines JOIN verwendet werden?

Welche anderen Optionen stehen mir zur Verfügung, um diese Ergebnisse zusammenzuführen? Nur ein Cursor?

Bearbeiten: Ich habe herausgefunden, wie Sie die zugrunde liegenden Hindernisse beheben, die mich zwangen, dynamisches SQL und eine gespeicherte Prozedur zu verwenden. Jetzt kann ich reguläres SQL verwenden, das mir erlaubt, eine Table Valued Function anstelle eines gespeicherten Proc zu verwenden, was mir erlaubt, JOIN und CROSS APPLY anstelle von hässlichen Cursor-Hacks zu verwenden.

+0

Welche SQL Server-Version verwenden Sie? – Coder1991

+0

SQL Server 2016 Standard Edition – Hydrargyrum

+1

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

Antwort

1

Rewrite Ihre gespeicherten Proc als eine Tabelle bewertet Funktion?

Alternativ schreiben Sie es neu, um den Filter zu entfernen, legen Sie es in eine Tabelle (möglicherweise eine temporäre Tabelle) ab, und verbinden Sie sich damit.

+0

Ich glaube nicht, dass ich es als Tabellenwertfunktion schreiben kann, weil ich dynamisches SQL verwenden muss, um die Abfrage auf der fernen Datenquelle zu erstellen. Ich kann den Tag-Name-Filter auch nicht aus der Remote-Abfrage entfernen, da die Remote-Abfrage ohne sie nicht gültig ist. – Hydrargyrum

+0

Warum machen Sie nicht die Remote-Abfrage auf einen Timer, ziehen Sie alle Tags in SQL, dann machen Sie die Join/TVF auf diese Daten ... Es macht keinen Sinn, eine Remote-Abfrage jedes Mal – Milney

+0

Die GetResultsForTag gespeichert proc fordert den PI-Server auf, eine Berechnung seiner Rohdaten durchzuführen und die Ergebnisse an mich zurückzugeben. Ich kann dies nur für ein Tag nach dem anderen tun, aufgrund des Designs des Remote-Abfrageprozessors - im Grunde benutze ich ein Feature, das verlangt, dass ich einen Filterausdruck als String-Wert übergebe, und dieser Ausdruck enthält auch den Tag-Namen . Ich würde lieber die (viel größeren) Rohdaten nicht über das Netzwerk verschieben oder die Berechnungen an meinem Ende neu implementieren. – Hydrargyrum

Verwandte Themen