2 Stimmen

SQL Server setzt mehrere Variablen

Ich habe 7 verschiedene gespeicherte Prozeduren, die eine Reihe von Parametern aufnehmen und Daten in 7 verschiedene Tabellen einfügen.

Ich erstelle nun eine Hauptprozedur, um diese 7 Prozeduren mit allen benötigten Daten auszuführen. Alle Daten, die sie benötigen, sind EINE Tabelle (CommonImport).

Sollte ich alle Parameter, die ich benötige, in diese gespeicherte Hauptprozedur aufnehmen?

Oder

Geben Sie nur die ID der Zeile ein, die in diese 7 separaten Tabellen eingefügt werden muss, und holen Sie die Daten direkt aus der Tabelle.

Ich halte die zweite Option für die beste. ABER, wie setze ich alle Variablen in der gespeicherten Hauptprozedur auf alle Daten aus der Tabelle (CommonImport)?

Wie setze ich eine Reihe von deklarierten Variablen auf die Werte einer bestimmten Zeile in der CommonImport-Tabelle?

Gracias

2voto

sll Punkte 59134

Ich würde vorschlagen, alle Variablen als Parameter zu akzeptieren und Standardwerte für sie zu definieren, so dass SP-Benutzer sie entweder mit einem einzelnen ID-Parameter oder mit einem anderen Parameter verwenden können, indem sie diese direkt angeben

CREATE PROCEDURE MainSP
  @ID int,
  @CustomParameter  varchar(10) = NULL,
  @CustomParameter1 DateTime = NULL,
  ...

Auf diese Weise wäre SP ziemlich flexibel

2voto

MatBailie Punkte 77040

Übergabe einer ID:

Der Vorteil dabei ist, dass Sie alle Schnittstellen zu Ihren gespeicherten Prozeduren vereinfachen.

Das macht es einfacher, dagegen zu kodieren. Wenn Sie den SP von mehreren Stellen aus aufrufen, müssen Sie nur einen einzigen Parameter verwenden, anstatt mehrere Parameter zu laden und zu übergeben.

Weitergabe n Variablen:

Der Vorteil dabei ist, dass Sie Ihre Stored Procedures von der Holding-Tabelle "entkoppeln".

Das bedeutet, dass Sie die gespeicherten Prozeduren einfach direkt aufrufen können, ohne Daten in der Tabelle zu haben. Dies kann in der Zukunft nützlich sein, wenn Daten auf eine neue Art und Weise ankommen, oder für Unit-Tests, etc.

Was ist das Beste:

Ich glaube nicht, dass es darauf eine eindeutige Antwort gibt, es ist eher eine Frage der Vorlieben und Meinungen.

Ich bin der Meinung, dass es umso besser ist, je weniger eng die Dinge miteinander verbunden sind. Es ist flexibler angesichts von Veränderungen.

Ich würde es folgendermaßen machen...

CREATE PROCEDURE main_by_variable @v1 INT, @v2 INT, ...
BEGIN
  EXEC sub_part_1 @v1, @v3
  EXEC sub_part_2 @v2
  EXEC sub_part_3 @v2, @v3
  ...
END

CREATE PROCEDURE main_by_id @id INT AS
BEGIN
  DECLARE
    @v1 INT,
    @v2 INT,
    ...
  SELECT
    @v1 = field1,
    @v2 = field2
  FROM
    holding_table
  WHERE
    id = @id

  EXEC main_by_variable @v1, @v2, ...
END
GO;

Indem sie die main_by_variable Prozedur haben Sie die Möglichkeit, alle Unterprozeduren zu testen, ohne tatsächlich Daten in die Holding-Tabelle eingeben zu müssen. Und diese Flexibilität ist auch Teil der Unterprozeduren.

Der Einfachheit halber können Sie aber auch die main_by_id ist aufgeräumter. Da dies nur ein Wrapper um main_by_variable ist, kapseln Sie nur einen einzigen Schritt des Prozesses (Abrufen der Daten aus der Tabelle).

Außerdem können Sie eine Transaktion um den Datenerfassungsteil legen und die Daten aus der Tabelle löschen. Oder viele andere Optionen. Es ist flexibel, und ich mag flexibel.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X