2009-04-15 5 views
6

ich auf einer gespeicherten Prozedur arbeite, die einige Operationen an Schülern in der Klasse es Status einige der auf einigen Kriterien Studenten aktualisiertSets Based Operations and calling Stored Procedures

Im letzten Schritt durchführt.

Es ist alles ziemlich einfach, aber ich habe ein Dilemma hier. Grundsätzlich gibt es eine bestehende sp im System

pUpdateStudentStatus(studentID, statusID, comments, userID) 

genannt Diese sp von der Anwendung verwendet wird, wenn ein Status eines einzelnen Benutzers aktualisiert werden soll. Neben dem Aktualisieren des Status werden auch die Änderungen in der Tabelle "StudentStatusHistory" protokolliert.

So, hier ist mein Dilemma,

  • , wenn ich will, dass die gespeicherte Prozedur I Schleife durch die Datensätze verwenden müssen (entweder durch den Cursor oder durch Schleife selbst zu schreiben)
  • wenn ich alle Operationen behalten möchten Set basiert ich brauche die Logik von der pUpdateStudentStatus zu kopieren (was sich in Zukunft ändern kann)

gibt es noch andere Optionen? Was würden Sie wählen?

Ich glaube, ein alternativer Ansatz mit dem Update-Trigger kein Weg ist, wie ich ein paar zusätzliche Details wie userId des Benutzers, den Status verändert und kommentiert I

muss gehen bin mit SQLServer2005

Antwort

4

Sie sagen nicht, ob pUpdateStudentStatus unter Ihrer Kontrolle oder von einem Dritten erstellt wird.

Wenn es ein SP von Drittanbietern ist, glaube ich nicht, dass Sie eine große Auswahl haben, sondern einen Cursor/eine Schleife verwenden, da sich die Interna des SP in zukünftigen Versionen ändern können. Wenn der SP unter Ihrer Kontrolle ist, wäre eine andere Option, eine Version von pUpdateStudentStatus mit einem neuen Namen zu erstellen, der satzbasiert arbeitet (vielleicht indem er eine Tabellenvariable von Argumenten akzeptiert) und dann neu schreibt Das vorhandene pUpdateStudentStatus fungiert als Wrapper, der die neue Prozedur mit einer einzelnen Zeile in der Argumenttabelle aufruft.

+0

Dank Ed, die Erstellung einer neuen Set-basierten Version von SP klingt wie eine interessante Lösung. In diesem speziellen Fall kann ich keine Tabellenvariablen (sqlServer2005) verwenden, aber ich mag die Idee im Allgemeinen. – kristof

1

Wenn Sie die Operation set-based beibehalten möchten dann ja, leider müssen Sie kopieren und fügen Sie die SQL-Adresse pUpdateStudentStatus.

Sie müssen sich einerseits für die Leistung eines Set-basierten Updates und andererseits für die Code-Wiederverwendung (und die Wartungsfreundlichkeit) entscheiden. Ich weiß, was ich normalerweise wählen würde, aber Ihre Wahl hängt von Ihrem Leistungsbedarf im Vergleich zu anderen Überlegungen ab.

+0

Normalerweise halte ich die Operationen auf Basis, aber diesmal kann ich eine Ausnahme machen, vor allem, weil der andere Code von einem anderen Entwickler geschrieben und gewartet wird und die Anzahl der betroffenen Datensätze ist wirklich klein, so dass die Leistung kein Problem sein sollte . Ich habe mich gefragt, ob es Alternativen gibt. – kristof

2

Persönlich, es sei denn, die Leistung ist ein Problem (und es klingt wie das ist wahrscheinlich die Art von Job, die gelegentlich ausgeführt werden und vielleicht sogar außerhalb der Arbeitszeiten geplant) Ich würde Schleife über die bestehende Prozedur. Die CPU ist ausnahmslos billiger als die DBA/Programmer-Zeit und Wartungserwägungen sollten die Effizienz außer Kraft setzen, es sei denn, dies hat Auswirkungen auf das Geschäft, wenn dies nicht geschieht. In jedem Fall sollten Sie dokumentieren, warum Sie den von Ihnen gewählten Ansatz im Code übernommen haben.

Wenn Sie noch kein Dokumentationsregime haben, würde ich vorschlagen, eine einfache Dokumentationstabelle in der Datenbank mit (mindestens) SP-Namen und Beschreibungstext einzurichten. Aufgrund der Art der gespeicherten Prozeduren/benutzerdefinierten Funktionen behalten Überblick Kontrolle darüber, welche Funktionalität implementiert wurde, wo schwierig sein kann, wenn einige Strategie angenommen wird und ich zu viele Datenbanken gesehen habe, wo es eine Masse von gespeicherten Prozeduren/UDFs und keine gibt einfache Methode zu groking welche Funktionalität wo implementiert wurde. Versionskontrolle und vollständige Dokumentation ist zu applaudieren, wenn Ihre Gruppe es unterstützt, aber wenn das nicht verfügbar ist, dann ist die Dokumentation der Datenbank in sich selbst einfach, robust und ein schneller Gewinn.

+0

Die Anzahl der betroffenen Datensätze ist sehr klein, daher sollte die Leistung hier kein Problem darstellen. Die Schleife scheint in diesem Szenario die beste Wahl zu sein. – kristof

+0

Zweifellos dann. Es gibt eine unglückliche Tendenz unter vielen Programmierern, über die Effizienz nachzudenken, wenn Wartung in der Praxis normalerweise wichtiger ist. Stellen Sie sicher, Sie kommentieren, warum, obwohl eine dieser Tendenz Sie wahrscheinlich einen Idioten später nennen wird, wenn sie auf Ihren Code stoßen. – Cruachan

1

Wenn Sie eine kleine Anzahl von Datensätzen erstellen, ist Schleifen zwar akzeptabel, aber wenn die Batch-Prozesse jemals groß werden, benötigen Sie Set-basierten Code.

Eine andere Alternative zu dem, was andere vorschlagen, wenn Sie die satzbasierte Logik benötigen, ist das Ändern des Procs, um entweder set-basierte oder individuelle Inserts zu ermöglichen. Indem Sie die Parameter optional machen (Ihre GUI muss prüfen, ob alle erforderlichen Parameter für einzelne Einfügungen übergeben werden) und einen Parameter für eine Batch-Nummer hinzufügen, die für den Set-basierten Betrieb übergeben werden soll, können Sie die Logik für beide in eins setzen Proz.

Wenn die Stapelnummer null ist, führen Sie die aktuellen Aktionen aus. Wenn es übergeben wird, gehen Sie zum Stapelverarbeitungsteil des Proc. Bei Batch-Prozessen kann der Einfügeprozess durch einen anderen Prozess ausgelöst werden, der eine neue Chargennummer generiert, die Informationen, die Sie einfügen möchten, in eine Arbeitstabelle einschließlich der Chargennummer einfügt. Dann verwendet es den Batchnumeb als Eingabeparameter für den Einfügeprozess.

Sie müssen immer noch die Logik für beide Fälle schreiben, aber da sie sich im selben Prozess befinden, sind sie leichter zu warten und Sie werden weniger wahrscheinlich vergessen, beide Prozesse zu aktualisieren.

Verwandte Themen