Forums Neueste Beiträge
 

Verschachtelung einer Gesoeicherten Prozedur

16/06/2009 - 17:13 von Patrick Pohlmann | Report spam
Hallo Zusammen,

ich habe eine SP die je nach Wert einer Variable (4 verschiedene
Möglichkeiten) eine andere Abfrage liefert. Die Sache ist nur die, dass ich
jetzt noch eine andere Variable (3 Möglichkeiten) einbringen möchte, die die
Anzahl der Möglichkeiten natürlich gleich auf 12 potensiert.

Die zweite Variable sagt aus ob gewisse Felder der Abfrage (Rechnungsnummer
und Rufnummer) veràndert werden müssen (Datenschutz) oder eben nicht. (im
ersten Fall nicht, im zweiten nur die Rufnummer, im dritten beides)

Die Frage ist, muss ich jetzt 12 verschiedene SELECTs kreiren (ist
irgendwann praktisch nicht mehr durchführbar) oder kann ich ggf. erst mit
der Variable 1 ein SELECT erstellen und dieses dann in Abhàngigkeit von
Variable 2 veràndern.

Also vielleicht das erste SELECT in eine Variable schreiben und diese dann
als Datenbasis für die zweite verwenden. Geht das in einer einzelnen
Prozedur? Ich habe schon daran gedacht mit einer RETURN Table zu arbeiten.
Aber soweit ich das sehe, kann ich da keine Bedingungen einbauen.

Sorry, ich bin nicht wirklich ein Fachmann in der Sache wie Ihr
feststellt...

Hier mal meine Prozedur. Schon jetzt vielen Dank für Eure Hilfe.

Viele Grüße

Patrick

ALTER PROCEDURE [dbo].[MeineProzedur]
@PersID nvarchar(50)

AS
BEGIN
SET NOCOUNT ON;

DECLARE @KundeNr int
DECLARE @Berechtigung int


set @Berechtigung = (SELECT B.Berechtigung
FROM dbo.RS_Berechtigungen B RIGHT OUTER JOIN
dbo.OS_Kundenmitarbeiter KM ON B.OS_KMitarbeiter =
KM.OS_KMitarbeiter
WHERE (KM.PersID = @PersID))


set @KundeNr = (SELECT KundeNr FROM OS_Kundenmitarbeiter WHERE
PersID=@PersID)

If @Berechtigung = 1 -- nur eigene Daten

BEGIN

SELECT R.VorgangNr, R.SubjektNr, R.VertragsNr, R.Rechungsnummer,
R.Rechnungsdatum, R.RgMonat, R.RgJahr, R.[Betrag netto], R.MwSt, R.[Betrag
brutto],
R.OS_KMitarbeiter, R.Kostenstelle, KM.PersID,
V.Rufnummer
FROM dbo.OS_MOB_Vertragsdaten V RIGHT OUTER JOIN
dbo.OS_Rechnungen R ON V.VertragNr = R.VertragsNr
LEFT OUTER JOIN
dbo.OS_Kundenmitarbeiter KM ON R.OS_KMitarbeiter =
KM.OS_KMitarbeiter
WHERE (R.SubjektNr = @KundeNr) AND (KM.PersID = @PersID)
END

else

If @Berechtigung = 2 -- Kostenstellenverantwortung

BEGIN

SELECT R.VorgangNr, R.SubjektNr, R.VertragsNr, R.Rechungsnummer,
R.Rechnungsdatum, R.RgMonat, R.RgJahr, R.[Betrag netto], R.MwSt, R.[Betrag
brutto],
R.OS_KMitarbeiter, R.Kostenstelle, KM.PersID,
V.Rufnummer
FROM dbo.OS_MOB_Vertragsdaten V RIGHT OUTER JOIN
dbo.OS_Rechnungen R ON V.VertragNr = R.VertragsNr
LEFT OUTER JOIN
dbo.OS_Kundenmitarbeiter KM ON R.OS_KMitarbeiter =
KM.OS_KMitarbeiter
WHERE (R.SubjektNr = @KundeNr) AND (NOT (R.VorgangNr IS NULL))
END

else

und so weiter.
 

Lesen sie die antworten

#1 Elmar Boye
16/06/2009 - 17:39 | Warnen spam
Hallo Patrick,

"Patrick Pohlmann" schrieb ...
ich habe eine SP die je nach Wert einer Variable (4 verschiedene Möglichkeiten) eine andere Abfrage liefert. Die Sache ist nur
die, dass ich jetzt noch eine andere Variable (3 Möglichkeiten) einbringen möchte, die die Anzahl der Möglichkeiten natürlich
gleich auf 12 potensiert.

Die Frage ist, muss ich jetzt 12 verschiedene SELECTs kreiren (ist irgendwann praktisch nicht mehr durchführbar) oder kann ich
ggf. erst mit der Variable 1 ein SELECT erstellen und dieses dann in Abhàngigkeit von Variable 2 veràndern.



Nein mußt Du nicht. Schau Dir mal an
http://www.insidesql.org/beitraege/...-und-segen

und suche Dir einen Mittelweg.
Da Du , soweit unten gezeigt immer eine gleiche Basisabfrage
bis auf die WHERE Bedingung hast, kannst Du das Basis SQL zunàchst
in eine Sicht verlagern, wodurch das Handling wesentlich vereinfacht
werden sollte.

Die WHERE Klausel kannst Du dann entweder dynamisch anfügen
oder mit bedingten Abfragen arbeiten wie
WHERE (@Berechtigung = 1 AND (R.SubjektNr = @KundeNr) AND (KM.PersID = @PersID))
OR (@Berechtigung = 2 ...)

wobei letzteres bei zuvielen Varianten zu ungünstigen Abfrageplànen
führt (wie obiger Artikel ausführlich erlàutert).

Gruß Elmar

Ähnliche fragen