Laden...

Aufruf einer SP ohne Rückgabewert

Erstellt von hipp1010 vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.576 Views
H
hipp1010 Themenstarter:in
79 Beiträge seit 2011
vor 11 Jahren
Aufruf einer SP ohne Rückgabewert

verwendetes Datenbanksystem: SQL-Server 2012

Hi,

gibt es eine Möglichkeit, eine SP anzustossen und gut ist es. Ich erwarte keinen Returnwert und sonst auch weiter nichts. Nach dem Aufruf kann die Verbindung sofort geschlossen werden. Könnte ichdas über einen TimeOut realisieren? Was pasiert am Ender der SP? Standardmäßig hat diese z.B. einen


return @rc

enthalten. Wenn der einfach ins Nirvana läuft istmir das egal. Rufe ich die SP einfach mit einen .ExecuteNonQuery auf?

Gruß Hipp

C
2.122 Beiträge seit 2010
vor 11 Jahren

Ja NonQuery ist genau dazu da.
Allerdings kommt auch dieser Aufruf erst dann zurück wenn die Prozedur fertig ist. Die Verbindung bleibt also so lange offen denn du kommst vorher nicht zu einem Close.

Wenn die Prozedur lange läuft und du dein Programm nicht so lange blockieren willst, nimm einen Task oder Thread oder BackgroundWorker.

H
hipp1010 Themenstarter:in
79 Beiträge seit 2011
vor 11 Jahren

Also die SP läuft je nach innerer Aufgabe zwischen 30 und 120 Minuten. Sämtliche Stati und Ereignisse werden im Server in einem LOG-Table protokolliert. Meine Idee ist die, dass ich den Timeout auf z.B. 10 Sekunden stelle. So würde mein Hauptprogramm sich kurz danach beenden und die SP kann ihr Werk tun.

Gruß Hipp

C
2.122 Beiträge seit 2010
vor 11 Jahren

Sofern sie nach dem Timeout nicht abbricht. Probier das doch einfach aus.
Dieses Verhalten klingt nicht mehr nach etwas das spontan auf Useraktion abläuft, sondern eher nach was geplantem. Kannst du das nicht als Task in deiner Datenbank planen? Oder du machst einen Dienst der die SP aufruft?

Was macht die wenn sie so lange braucht?

H
hipp1010 Themenstarter:in
79 Beiträge seit 2011
vor 11 Jahren

Also folgendes Prinzip: Ich habe einen Dienst, der sich einen nächsten Task aus der DB holt. Mit den Einstieg-Paramteren wird ein externer TaskManager gestartet, der verschiedene Prozesse startet oder gar selber durchführt. Auf Grund der Definition (hier ein System-Task zum automatischen Download und Import von Daten unserer Zentrale) soll z.B. nur eine Master-SP angestoßen werden. Diese beinhaltet ein dutend weitere Schritte etc. Alles wird imm LOG-Table und in den dazu gehörenden Parameter-Tabellen dokumentiert und kann über ein Frintend-Pgm verwaltet werden.

Der Start einer SP ohne abzuwarten, was geschieht ist also bewusst.

Gruß Hipp

C
2.122 Beiträge seit 2010
vor 11 Jahren

Die SP braucht eine Connection und der Aufruf wartet bis die SP fertig ist. Anders gehts zumindest einfach nicht. Komplizierter scheints zu gehen, ich hab mal interessehalber gesucht.
Guck z.B. hier
Eine Idee ist, in eine Tabelle einen Eintrag einnzufügen und ein Trigger auf diese Tabelle führt dann die SP aus. Wenn du in die Tabelle die Parameter für die SP einträgst, hast du die Werteübergabe auch schon gelöst.

Erzähl uns wenn du noch was anderes findest. Ich wüsste zwar grad nicht wann ich mal so lange Prozeduren hätte, aber interessant ists sicher zu wissen.

H
hipp1010 Themenstarter:in
79 Beiträge seit 2011
vor 11 Jahren

Die mit dem Trigger klingt gut. Ich werde mir das Ganze einmal in Ruhe ansehen.

Wenn die SP system-bedingt abbricht, do wird dies protokolloiert. Das Gleiche gilt auch für einen fachlichen Abbruch.

Zur Laufzeit sei gesagt, dass einige Unter-SP's und FN's mit diversen Assemblies integriert sind. Z.B. ein Datei-Download (1GB) inkl. Unzip und spezieller Konvertierung und anschließendem BULK INSERTin diversen Tabellen (ca. 20 MIO Sätze) Mit etlichen Qualitätsprüfungen dauert das Ganze ca. 1,5 Stunden. Habe das bisher des öfteren manuell gestartet. Bei einem Abbruch wird ein Recovery der bereits zuvor erfolgreich importierten Daten vorgenommen. Natürlich könnte ich den Download + DeZip und Konvertierung auch vom meinem TaskManager aus machen und dann die SP mit dem Import und den Prüfungen starten, aber bisher läuft das alles super und rund.

Gruß Hipp

H
hipp1010 Themenstarter:in
79 Beiträge seit 2011
vor 11 Jahren

Habe alle Varianten wie genannt probiert.

--> NICHTS.

Auch der Trigger geht nicht. Klar, hab ich mir schon irgendwie gedacht. Die SP wird im Kontext der Verbindung des aufrufenden rechners gestartet. Egal ob normal oder asynchron, alles versucht, sobald das Programm beendet wird, geht auch die SP kaputt.

Nun habe ich eine spezielle Sp gebaut, die einen Job anlegt. Mit 1 Minute Verzögerung startet nun die eigenliche SP wunderbar mit den defnierten Parametern.

Kompliziert aber alles super.

Danke für Euro Hilfe und Anregungen.

Gruß Hipp

502 Beiträge seit 2004
vor 11 Jahren

Also ohne es jetzt wirklich geprüft zu haben bin ich mir doch zu 99% sicher, dass es nicht möglich ist, den SQL-Server arbeiten zu lassen, ohne ein Programm mit einer offenen Verbindung zu haben.
D.h. Du kannst das Ganze zwar evtl. in einen Hintergrund-Thread verlagern o.ä., aber wenn Du wirklich den Prozess beendest, bricht der SQL Server die Ausführung ab.

Spontan fällt mir genau ein Ausweg dazu ein: Nutze den SQL-Server Agent oder auch ein eigenes, separat anzustossendes Programm, welches (im Hintergrund) läuft und die Verbindung aufrecht erhält. Das Ganze wird dann aus Deinem Hauptprogramm heraus nur "angestossen" und läuft quasi losgelöst (und v.a. als eingener Prozess) - egal ob nun DeineApp.exe oder der Agent.

Bart Simpson

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...

S
127 Beiträge seit 2004
vor 11 Jahren

Hallo *,

wenn ich das richtig verstehe, dann hast du einen ETL Prozess. Hier für bietet der SQL Server die Integration Services (SSIS).
Über den SSIS kannst du ein Paket erstellen welches alle deine Schritte macht.
SSIS-Pakete sind so ähnlich wie die Workflow Foundation.
Dort kannst du auch im 2012 C# verwenden (im 2008 war nur VB.Net möglich).

Das Paket legst du dann auf dem entsprechenden Server ab, und erstellst einen SQL Agent Job dafür. In dem Job sollte keine Zeitplanung sein.

Den Job kannst du dann über deinen Taskmanager starten, in dem du folgendes SQL Statement absetzt.

"exec sp_start_job @JobName;"

Der Aufruf ist innerhalb des SQL Server async., damit meine ich die Prozedure warte nur so lange bis der Job erfolgreich angelaufen ist und gibt dir sofort wieder eine Antwort.