2016-10-24 2 views
0

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.

+0

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. –

+0

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

Antwort

4

Die Art, wie Sie @FutureEffectiveDate für NULL in CASE-Anweisung überprüft haben, ist falsch. Hier ist eine kleine Demo

declare @FutureEffectiveDate as date = null 

Select Case @FutureEffectiveDate when NULL then 1 else 0 end 

Die obige Abfrage 0 führen wird. Weil die obige CASE-Anweisung den Eingabeausdruck wie @FutureEffectiveDate = NULL validiert, der fehlschlägt. NULL sollte IS Betreiber

Hier ist der richtige Weg NULL

SELECT CASE 
     WHEN @FutureEffectiveDate IS NULL THEN 
      CASE .. 
+0

Ich habe versucht, CASE @ FutureEffectiveDate WENN IST NULL, aber hatte einen Syntaxfehler, und das erste Mal sah ich auf Ihre Demo, konnte den Unterschied nicht sehen, aber das Argument innerhalb der WHEN, wie Sie sagen, löst tatsächlich die Problem. Ist dieses Format nur beim Vergleich mit NULL notwendig? In den anderen CASE-Anweisungen habe ich das Format CASE Argument WHEN X THEN ... END verwendet und diese funktionieren wie erwartet. – MartinS

Verwandte Themen