Ich habe Probleme, die Daten, die ich von einer gespeicherten Prozedur erwarten würde. Die Prozedur wird sowohl zum Einfügen als auch zum Aktualisieren des Datensatzes verwendet und bestimmt, welche Parameter beim Aufruf festgelegt werden. Mein Beispiel hier nimmt an, dass der Parameter DATE type den Standardwert NULL hat, d. H. Sie wurden nicht in sp übergeben. Ich habe den Code unten in einen kleinen Abschnitt gebrochen zu beheben, anstatt den gesamten Prozedur-Code zu enthalten, wie folgt:SQL-Nested-Case-Anweisungen in Stored Proc
-- these would be sp parameters
declare @CustomerId int = 15
declare @Indicator varchar(5) = 'Yes'
declare @ProjectTypeId tinyint = 1
declare @FutureEffectiveDate as date = null
SELECT
CASE @FutureEffectiveDate
WHEN NULL THEN
CASE @Indicator
WHEN 'Yes' THEN
-- can only be 1, 2 or 3 to return relevant date
CASE @ProjectTypeId
WHEN 1 THEN DI.[NextFormalEffectiveDate]
WHEN 2 THEN DI.[NextInterimEffectiveDate]
WHEN 3 THEN DI.[NextAccountingEffectiveDate]
END
-- data should be NULL if @Indicator not 'Yes'
ELSE NULL
END
ELSE @FutureEffectiveDate
END AS [FutureEffectiveDate]
FROM
[_Staging].[DataImport_2] AS DI
JOIN
[CustomerView] AS CV ON CV.[CustomerNumber] = DI.[BillingInvoiced]
JOIN
[ProjectType] AS PT ON PT.[ProjectType] = DI.[ProjectType]
WHERE
CV.[CustomerID] = @CustomerId AND
PT.[ProjectTypeID] = @ProjectTypeId
So ist die Idee, dass für Datensätze, bei denen ein Feld den Text enthält ‚Ja‘, und Basierend auf dem Projekttyp für diesen Datensatz wählt er eines von drei Daten aus. Wenn das Feld nicht 'Ja' ist, sollte NULL zurückgegeben werden, wobei der Projekttyp ignoriert wird. Wenn der date -Parameter NICHT NULL ist, sollte er einfach den übergebenen Parameter zurückgeben. Das Ergebnis wird als die Spalte 'FutureEffectiveDate' zurückgegeben. Mit den Beispieldaten, die ich habe, würde ich erwarten, dass ein Datum zurückgegeben wird, da das relevante Feld "Ja" ist, und die Spalte NextFormalEffectiveDate einen Wert hat (als Projekttyp ist 1).
Seltsamerweise, wenn Sie die äußere CASE-Anweisung ausschließen, funktioniert es. Das Problem besteht also darin, basierend auf dem DATE-Parameter zu bestimmen, was zu tun ist, aber ich kann nicht erkennen, warum die äußere CASE-Anweisung das Ergebnis bricht.
Haben Sie Sie in NULL sind einfach zu vergleichen mit verglichen werden, wie Sie das Datum Parameter übergeben? Ich habe das oft als leere Zeichenfolge übergeben und die Leute dachten, es wäre NULL, wenn es tatsächlich 1900-01-01 ist. –
Ja, die Absicht ist hier, dass das SP sowohl von meiner Benutzerschnittstelle als auch vom Datenimportprozess verwendet werden kann. Anstatt zwei Prozeduren zu schreiben, setze ich die Parameter in der Signatur auf null, wenn sie also nicht übergeben werden kann sie aus der Datenbank lesen und das UPDATE ausführen, aber wenn sie ausgefüllt werden, werden sie als Teil der INSERT-Anweisung verwendet. – MartinS