Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwenden Sie SQL, um die Ergebnisse einer gespeicherten Prozedur zu filtern

Es gibt keine guten Möglichkeiten, das zu tun. Es ist eine Einschränkung gespeicherter Prozeduren. Ihre Optionen sind:

  1. Schalten Sie die Prozedur auf eine benutzerdefinierte Funktion um . Überall auf der Welt erstellen Menschen heute gespeicherte Prozeduren, die Funktionen sein sollten. Es ist eine Bildungsfrage. Ihre Situation ist ein gutes Beispiel dafür. Wenn Ihre Prozedur stattdessen eine UDF wäre, könnten Sie einfach Folgendes tun, genau so, wie Sie intuitiv denken, dass Sie dazu in der Lage sein sollten:

    SELECT * FROM udf_who2()
    WHERE login='bmccormack'
    
  2. Wenn Sie Ihr Verfahren wirklich nicht anfassen können und müssen Haben Sie dies in SQL getan, dann müssen Sie funky werden. Erstellen Sie eine andere gespeicherte Prozedur, um Ihre ursprüngliche Prozedur zu umschließen. Rufen Sie innerhalb Ihrer neuen Prozedur Ihre vorhandene Prozedur auf und fügen Sie die Werte in eine temporäre Tabelle ein, führen Sie dann eine Abfrage für diese Tabelle mit dem gewünschten Filter aus und geben Sie das Ergebnis an die Außenwelt zurück.

Beginnend mit SQL Server 2005 kapseln Sie den Datenabruf mit benutzerdefinierten Funktionen. Gespeicherte Prozeduren sind zusammen mit Ansichten Spezialwerkzeuge, die in bestimmten Situationen verwendet werden können. Sie sind beide zur richtigen Zeit sehr praktisch, aber nicht die erste Wahl. Einige mögen denken, dass das obige Beispiel (A) alle Ergebnisse der Funktion erhält und dann (B) nach dieser Ergebnismenge filtert, wie bei einer Unterabfrage. Das ist nicht der Fall . SQL Server 2005+ optimiert diese Abfrage; wenn es einen Index zu login gibt , sehen Sie keinen Tabellenscan im Abfrageausführungsplan; sehr effizient.

Bearbeiten :Ich sollte hinzufügen, dass die Innereien einer UDF denen einer SP ähneln. Wenn es die Logik durcheinander bringt des SP, den Sie vermeiden möchten, können Sie ihn immer noch in eine Funktion ändern. Ich habe mehrmals großen, unheimlichen Prozedurencode genommen, den ich nicht verstehen wollte, und ihn erfolgreich in eine Funktion übertragen. Das einzige Problem wird sein, wenn sich die Prozedur ändert alles andere als die Rückgabe von Ergebnissen; UDFs können keine Daten in der Datenbank ändern.