Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

SQL Server 2016: Triggers, Stored Procedures und Funktionen

Beispiel einer Prozedur

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Dieses Beispiel zeigt das Zusammenspiel von Cursor, Fehlerbehandlung und einigen weiteren Features.
08:01

Transkript

Bevor dieses Kapitel über die Programmierung mit Stored Proceduren zu Ende ist, zeige ich Ihnen nochmal ein etwas umfangreicheres Beispiel. Es ist die einzige Stored Procedure, die eine spezielle Datenbank braucht. Die Datei finden Sie ebenfalls im Download zu diesem Kurs. Und die Datenbank wird angelegt über dieses Script. Es werden vier Tabellen angelegt und die Tabellen werden entsprechend mit Inhalt versorgt, das sollte relativ schnell gehen. Das heißt, wenn ich das ausführe, dann sollte hier eine weitere Datenbank aufgetaucht sein. Wenn ich hier mir die Größe anschaue, sehen Sie 6,69 MB, nicht besonders viel. Selbst wenn ich jetzt hingehe und mir die Größe der einzelnen Tabellen anschaue, sehen Sie eher sehr überschaubar. Wenn ich diese Tabelle für die Stored Procedure habe, dann kann ich in die Stored Procedure wechseln. In der Stored Procedure geschieht dann erst einmal folgendes: Die Stored Procedure selber wird gelöscht in dem Script, wenn schon vorhanden, vorher wird die Datenbank natürlich gewechselt. Das kann ich beliebig häufig aufrufen, da wird nichts passieren, weil sie dürfte schlichtlich vorhanden sein. In der Stored Procedure passiert dann genau das: Zunächst einmal SET NOCOUNT ON wird aufgerufen. Das heißt, ich möchte nicht wissen, wie viele Zeilen getroffen sind, dieses so viele ROWS AFFECTED taucht da nicht mehr auf, das brauche ich nicht. Dann deklariere ich einen Cursor. Der Cursor basiert auf dieser Abfrage und zwar wählt er mir einige Felder, zwei Stück genau gesagt, aus dieser Tabelle aus und fehlt dann entsprechend nach [Aktiv] = 1 und sortiert nach der ID, das ist dann ungefähr genau diese ergibte Menge von 484 Zeilen. Wenn man möchte, kann man das auch entsprechend über das Schema noch ausqualifizieren. Dann beginne ich mit einem TRY-Block. In dem TRY-Block deklariere ich eine Reihe von Variablen, die ich benötige, und zwar genau wie Parameter, sieht das so aus, dass ich sage @, dann den Namen der Variable und den entsprechenden Datentyp. Dann öffne ich den Cursor, also ich gebe eine Meldung raus, ja, aber... wichtig ist, ich öffne ein Cursor. Dann ziehe ich die ersten Werte in die beiden Variablen. Das heißt, der Cursor, wenn es möglich ist, entsprechend versucht aus der ersten Zeile die Werte auszulesen. Falls das nicht möglich ist, ist @@FETCH_STATUS = 0. Wenn aber gleich 0 ist, haben wir hier eine WHILE-Schleife. Die WHILE-Schleife selber soll so lange laufen, bis es keine nächste Zeile gibt und theoretisch hätte das ganz am Anfang schon der Fall sein können. Der Block der WHILE-Schleife beginnt mit BEGIN und hat hier unten auch ein entsprechendes END. Und innerhalb dieses Blocks wird erstmal ein kleiner Text ausgegeben, Leerzeichen, dann wird eine Variable zugewiesen, die wird auch ausgegeben, dann wird noch ein Cursor deklariert und ich kann zum Beispiel sagen, ich möchte noch einen zweiten Cursor haben, der genau auf diese Abfrage aufbaut. Ich kann die Abfrage selber auch genau theoretisch isolieren. Allerdings hier @spieler_ID ist eine Variable, die ich nicht habe, aber wir haben hier einen inneren Cursor, das heißt, ich kann hingehen und einen zweiten TRY-Block aufbauen. Ich kann diesen Cursor öffnen und von dem inneren Cursor ebenfalls versuchen, ob es möglich ist, die ersten Werte ins zwei Variablen zu ziehen. Falls das nicht der Fall sein sollte, gebe ich einfach < aus. Dann habe ich noch einen WHILE-Block. Der prüft auch @@FETCH_STATUS und solange dieser 0 ist, durchläuft dieser Block zwischen BEGIN und END genau die Logik, die ich hier habe, nämlich, dass der Variable Message über die CONCAT-Funktion eine Reihe von Werten zusammen gehangen werden und die werden ausgegeben und dann geht schon in die nächste Ausführungszeile. Das bedeutet, der Cursor wird solange durchlaufen, solange diese Abfrage hier oben in der Tat immer noch weitere Zeilen liefert. Danach wird der Cursor geschlossen und entsprechend deallokiert. Dann habe ich den CATCH-Block und zwar den CATCH-Block für das innere TRY, deshalb habe ich auch Fehler im inneren Cursor. Hier schließe ich vorsichtshalber auch nochmal den Cursor. Das heißt, das wiederholt sich hier unten. Allerdings wenn das ausgeführt wird, werde ich höchstwahrscheinlich nicht hier unten landen und das ins nur für den Fehlerfall. Das heißt in den Fall schließe ich den Cursor, deallokiere den Cursor, und gebe die Fehlermeldung quasi nach oben in den äußeren CATH-Block. So, dann bin ich quasi wieder in dem äußeren TRY und versuche entsprechend mit FETCH NEXT FROM [spieler_cursor] mir die nächste Zeile in diese Variable zu holen. Damit bin ich mit diesem END und dieses END gehört zu dem Ausführungsblock an dieser Stelle. Das heißt, damit wird sozusagen der äußere Cursor so lange durchlaufen, bis in der Tat die letzte Zeile erreicht wurde. Danach wird der Cursor geschlossen und zwar der äußere in dem Fall, und damit ist auch der äußere TRY-Block beendet. Dann entsprechend ein äußeres CATCH. Fehler am äußeren Cursor, wenn es so an solchen kommt, und entsprechend wird dann noch der Cursor geschlossen und der Fehler mit alle seinen Details ausgegeben, das sind die sechs Fehlerfunktionen, die Sie auch in Error Handling gefunden haben. Das war es an der Stelle. Das bedeutet aber auch, dass dieser CATCH-Block immer dann angelaufen wird, wenn im inneren CATCH-Block einen Fehler aufläuft. Das heißt, der TRY-Block einen Fehler erzeugt, der innere CATCH-Block den abfängt und damit THROW weiter an die äußere Ebene weiterleitet. Dann entsprechend der äußere Cursor wird geschlossen, Fehler wird ausgegeben und der Fehler wird hier aber nicht weiter an den Aufrufer dirigiert. Das heißt, der Aufrufer hier unten, der quasi nichts anderes macht als die Stored Procedure aufzurufen, wird in dem Fall von keinen Fehler in Kenntnis gesetzt, es kommt zwar die Details, aber es wird technisch keinen Fehler ausgelöst. Damit müsste ich hingehen und hier noch ein weiteres THROW-Statement reinschreiben. Wenn ich das laufen lasse, dann sieht das Ergebnis so aus, dass er die Reports, die Highscores der einzelnen Spieler in den jeweils äußeren Cursor durchläuft, das heißt, der äußere Cursor durchläuft entsprechend alle Spieler. Ich zeige das nochmal kurz. Der äußere Cursor sieht nämlich so aus, SELECT FROM [dbo] [Spieler] und der innere Cursor durchläuft alle Highscores genau dieses Spielers und das sehe ich hier an der Stelle. Das heißt, ich habe hier einen Cursor und sagt er mit dem wesentlichen SELECT FROM [spielerID] wird hier eingegrenzt, die kommt entsprechend aus der Highscore Tabelle und ich habe hier nur noch ein JOINT, die mir erlaubt die Spieler sprechend anzuzeigen. Das ist das, was der innere Cursor macht. Zusammen sieht es halt so aus, dass erst alle Spieler und dann die jeweils für jeden einzelnen Spieler die Highscores ausgegeben werden. Damit können Sie sich anschauen, wie zum Beispiel auch Cursor realisiert werden können in Stored Proceduren.

SQL Server 2016: Triggers, Stored Procedures und Funktionen

Nutzen Sie in SQL Server Trigger, gespeicherte Prozeduren, Late Binding, Fehlerbehandlung sowie Scalar- und Tabellenwertfunktionen.

3 Std. 12 min (44 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Hersteller:
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:08.08.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!