Announcement

Collapse
No announcement yet.

Update

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Update

    Hi Leute,

    ich brauche eure Hilfe.

    Ich habe ein Trigger laufen, der mir alle Änderungen einer Tabelle auf eine Tabelle protokolliert. Alles läuft auch wunderbar, bis auf die Tatsache, dass der Trigger nichts protokolliert, wenn eine Änderung einer datetime-Spalte von "NULL" auf etwas durchgeführt wurde.

    Ist dieses Phänomen irgend einem bekannt?

    Grüße

  • #2
    Dürfte irgendwie damit zu tun haben, wie du diesen Trigger programmiert hast. Denn so ein Fehler wäre von MS längst entdeckt und ausgebessert worden.

    bye,
    Helmut

    Comment


    • #3
      Hi Helmut,

      Ich glaube das war einfach nur ein Denkfehler meinerseits.

      Es handelt sich um folgenden Code:
      Code:
      IF UPDATE (columnA)  
      BEGIN
      	IF ( (case @del_var when null then '' else @del_var end) <> (case @ins_var when null
                       then '' else @ins_var end) ) 
              BEGIN 
      		SELECT 'ois kloa'
              END
      END
      Es handelt sich wohl um die Case-Anweisung. So wie es ausschaut vergleicht Case mittels "=". Was ich aber nicht versteh ist, warum dieser Vergleich bei allen anderen Attributarten funktioniert bis auf datetime.

      So habe ich es verbessert.
      Code:
      IF UPDATE (columnA)  
      BEGIN
      	IF ( (case when @del_var is null then '' else @del_var end) <> (case when @ins_var is 
                       null then '' else @ins_var end) ) 
              BEGIN 
      		SELECT 'ois kloa'
              END
      END
      Grüße

      Comment


      • #4
        Ich glaube, da irrst du ein bisschen. Deine erste Variante funktioniert auch bei keinem anderen Datentyp. Sobald NULL im Spiel ist, muss man bei CASE mit einem "komplexen CASE-Ausdruck" arbeiten, weil der "einfache CASE-Ausdruck" mit dem '=' arbeitet. Steht alles in der Beschreibung (muss zugeben, im ersten Anlauf hätte ich mich vielleicht auch vertan).

        bye,
        Helmut

        Comment


        • #5
          Das ist ja das Lustige. Bei den anderen Attributarten funktioniert es *großes Fragezeichen über dem Kopf*

          Comment


          • #6
            Also ich weiß nicht wie du das ausprobierst, aber das hier
            Code:
            declare @x int, @dt datetime
            
            set @x = null
            set @dt = null
            
            select case @x when null then 'null' else 'not null' end
            select case when @x is null then 'null' else 'not null' end
            
            select case @dt when null then 'null' else 'not null' end
            select case when @dt is null then 'null' else 'not null' end
            liefert bei mir im ersten Vergleich immer den else-Wert und im zweiten dann den korrekten, also genau wie's in der Beschreibung steht.
            Getestet mit SSMS auf SQL-Server 2008

            bye,
            Helmut

            Comment


            • #7
              Hey Helmut,

              ich habe jetzt mal genauer hingeschaut. Meine Aussage gestern war falsch. Tatsächlich waren es keine NULL-Werte. Es waren ''-Werte, die durch die Case Anweisung richtig durchgekommen sind.

              Habe es auch nochmal getestet, weil ich s einfach nicht verstanden habe und kam auf das selbe ergebniss.

              Danke für dein Feedback und beste Grüße

              Daman

              Comment

              Working...
              X