SSMS funktioniert nicht mehr richtig

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von slice.

    SSMS funktioniert nicht mehr richtig

    Hallo zusammen,

    seit einigen Jahren arbeite ich mit SQL und SSMS. Doch seit zwei Tagen tritt ein Fehler bei schon oft benutzten Tabellen und Sichten auf, den ich nicht klären kann,
    In einer Tabelle existiert eine Spalte Geburtstag (einer Person), die eine berechnete Spalte ist (der Geburtstag wird aus einer Versicherungsnummer extrahiert. Diese Geburtstagsspalte wird als nvarchar(24) erzeugt bei der Berechnung.
    Ich habe dazu eine Sicht erzeugt, in der mit diesem Geburtstag (dd.mm.jjjj) weiteres berechnet wird. Wenn ich den entsprechenden SELECT auf SYntax prüfe gibts kein Problem. Wenn ich ihn ausführe, kriege ich die Fehlermeldung (siehe ersten Anhang). Inhalt: FrameWork Microsoft SqlClient Data Provider, Fehler beim Konvertieren einer Zeichenfolge in ein Datum und/oder eine Uhrzeit.
    Wenn ich allerdings nun OK klicke, werden die darzustellenden Daten eigentlich richtig ermittelt und dargestellt (siehe zweiten Anhang). Nun gut, unerklärlich, warum dann die Fehlermeldung...
    Was aber am meisten stört ist, wenn ich diese Sicht in meiner Anwendung anwenden will, kommt natürlich auch dieser Fehler und nichts geht mehr.
    Und noch mehr stört mich, dass dieser Fehler mindestens 5 Jahre nicht gekommen ist, hat mehrere Updates von SSMS 'überlebt' und tritt erst seit drei Tagen ohne vorherige Änderungen an der Datenbank auf.
    Ich habe keine Idee, wie ich diesen Fehler wieder abstellen könnte...??

    Grüße - Dietrich
    Bilder
    • sql msg Screenshot 2024-08-18 132036.png

      28,56 kB, 610×445, 24 mal angesehen
    • sql listeScreenshot 2024-08-18 132130.png

      5,8 kB, 840×152, 18 mal angesehen
    Mir leuchtet noch nicht ganz ein wo du den Fehler kriegst, bzw. was du tust um ihn zu erzeugen.
    SMS ist Sql Server Management Stuido oder? So ein Fehler-Fenster hab ich da noch nie gesehen, deswegen muss ich nachfragen.

    Wenn der Fehler wirklich im Management Studio besteht, poste einmal den Create der Tabelle und die eigentliche Query.

    Du hast auch schon probiert das Datum anders anzugeben? Date Literale sehen so aus: 'yyyy-MM-ddTHH:mm:ss.fff'
    Hallo, ja es passiert alles im SQL Server Management Studio, neuste Version.
    Ich gehe auf Entwerfen bei meiner Sicht:
    SELECT TOP (100) PERCENT Anrede, Name, Geburtstag, DATEDIFF(day, Geburtstag, GETDATE()) / 365 AS Age, DATEDIFF(day, CAST('1.1.' + CAST(DATEPART(year, Geburtstag) AS nvarchar) AS date), Geburtstag) + 1 AS Tag
    FROM dbo.Klienten
    Geburtstag ist die berechnete Spalte (siehe ersten Thread), Klienten ist die Datatable.
    Der Fehler taucht sofort auf, wenn ich SQL ausführen klicke. Dann klicke ich auf OK bei der Fehlermeldung und dann werden die Ergebnisse angezeigt. Das Datum/Geburtstag kommt im Format dd.mm.jjjj (nvarchar).
    Wie gesagt, das hat schon einige Jahre geklappt. Ach so, vor paar Tagen erschien beim Datenbanken verbinden, dass meine Datenbank wiederhergestellt werden müsse, das habe ich gemacht, die Spalte Geburtstag wurde get berechnet, doch seitdem kommt der ominöse Fehler...
    Für mich riecht das nach "fehlerhaften" Daten bzw. nicht anfangen in der "Berechnung".
    Die Meldung besagt ja das es beim Konvertieren einer Zeichenfolge passiert.

    Ich würde erst mal die Daten prüfen, ob dort NULL oder Müll vorkommt.
    Ein Grundübel: Wieso ist die Spalte als varchar deklariert, wenn Datumse reinsollen?
    Merke: Nimm immer den richtigen Datentyp!. Dann sind Konvertierungen unnötig, und es gibt auch keine Konvertierungsfehler.

    Vermutlich lässt sich das jetzt nicht mehr korrigieren, oder? Wenn doch, korrigiers!

    Andenrfalls kannst du mal gucken, ob sich die bei der Konvertierung verwendete Culture geändert hat. Ich glaub zB, dass '17.10.1974' in en-Culture nicht nach Datum konvertierbar ist.
    Danke an alle für die Tipps!

    @Erfinder des Rades: Diese Versicherungsnummer ist als nvarchar gespeichert, weil recht lang. Und aus dieser wird der integrierte Geburtstag geholt mittels Formel und wird dadurch zur berechneten Spalte - auch nvarchar. Und für eine berechnete Spalte kann man KEINEN Datentyp vorgeben.
    Ich habe auch schon mal 1974/10/17 versucht anzuwenden - kein Erfolg

    @slice. ich prüfe auf Geburtstag Is not NULL mittels Where.

    Was mich stört am Ganzen ist, dass es ein paat Jahre super funktioniert hat und jetzt -bang- nicht mehr...
    Aber ich werde eure Tipps versuchen anzuwenden!


    !!! Habe soeben deinen Tipp angewendet Haudruff.... Es kommt dieselbe Fehlermeldung. Gerechnet wird trotzdem richtig.
    Weiter geht`s

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dherr“ ()

    Mit "Geburtstag Is not NULL mittels Where" bist du aber etwas zu spät, das findet ja NACHDEM du das Zeug berechnet hast statt.
    Die Fehlermeldung sagt aber "Konvertieren einer Zeichenfolge in ein Datum ...", heißt irgendwo bei deinem "DATEPART"/"CAST"/"DATEDIFF" oder was auch immer du treibst - die vollständige Query zeigst du ja nicht.


    Nachtrag:
    Und wegen dem "Geburtstag Is not NULL mittels Where" siehst du wahrscheinlich den fehlerhaften Eintrag nicht

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „slice“ ()

    @slice: In meinem zweiten Thread siehst du vollständiges Query. Ob ich Where... hinzusetze oder nicht, die Fehlermeldung kommt. Und wenn ich bei der Fehlermeldung OK klicke, werden meine berechneten Daten auch richtig angezeigt,
    Die Sicht in der Form aber in meinem VB.net Programm anzuwenden ist aber nicht möglich, weil die Fehlermeldung dort auch kommt, wenn ich die Sicht in ein Dataset speichern will. Bei solcher Fehlermeldung bricht das Programm dann ab.
    Und das hat eben seit ca 10 Jahren absolut funktioniert, seit paar Tagen eben nicht mehr. MUSS am SSMS oder Server liegen.

    Aber: Gibt es eine Möglichkeit, die berechneten Werte (Geburtstag extrahiert aus Versicherungsnummer, nvarchar) als Datumswert konvertiert in eine andere Spalte zu "transportieren"?

    Noch etwas fällt mir auf: Schaut man gennauer hin bei dem ersten Screenshot (Fehlermeldung) sieht man hinter Tag noch weiter Namen von Datenfeldern aus der Kliententabelle. Eigentlich haben die da doch nichts zu suchen,oder? Die gehören doch nicht zur Select-Anweisung...

    dherr schrieb:

    Diese Versicherungsnummer ist als nvarchar gespeichert, weil recht lang. Und aus dieser wird der integrierte Geburtstag geholt mittels Formel und wird dadurch zur berechneten Spalte - auch nvarchar. Und für eine berechnete Spalte kann man KEINEN Datentyp vorgeben.
    Dann wird bei der Berechnung schon gepfuscht. Der wird den Datentyp des Outputs als Datentyp für die Spalte anlegen. Da sollte man schon ordentlich zu datetime konvertieren. Kannst du die Berechnung ändern? Wenn ja zeig uns mal die Berechnungsvorschrift

    Ansonsten kannst du mal die ganze Query posten? Du sagst die anderen Felder haben da nichts zu suchen, aber womöglich ist das schon die Query aus dem View, die auf die Schnauze fliegt.
    Und dann gehst mal hin und sagst in der Query Select Top 1 und guckst ob der Fehler besteht. Wenn Nein, dann such das Top X wo das Konvertierungsproblem besteht.
    Und diesen Geburtstagwert, der da in der letzten Zeile steht, kannst du uns auch mal zeigen, dann können wir das nachstellen.

    Also: Tabelle mit berechneter Spalte -> View -> deine Query.
    In der Reihenfolge sollte man prüfen, dass alles korrekt ist.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    OK.
    Eingabe vom Anwender, gespeichert in Tabelle Klienten:
    Versicherungsnummer nvarchar(10) sie muss immer 10 Stellen haben, die letzten 6 sind das Datum ddmmjj

    Ermitteln aus Versicherungsnummer: (x-mal probiert, letztendlich in Date zu konvertieren, geht nicht)
    Geburtstag (((((case when (CONVERT([int],'19'+substring([Versicherungsnummer],(9),(2)),(0))-datepart(year,getdate()))*(-1)>=(100) then '20' else '19' end+substring([versicherungsnummer],(9),(2)))+'-')+substring([versicherungsnummer],(7),(2)))+'-')+substring([versicherungsnummer],(5),(2)))

    Bei der Berechnung wird beachtet, ob jj noch ins 19 Jh. oder schon ins 20. Jh. fällt (etwas speziell vom Anwender, deshalb diese Abfrage >=100

    Query für die Sicht:
    SELECT TOP (100) PERCENT Anrede, Name, Geburtstag, DATEDIFF(day, Geburtstag, GETDATE()) / 365 AS Age, DATEDIFF(DAY, DATEFROMPARTS(YEAR(Geburtstag), 1, 1), Geburtstag) + 1 AS Tag
    FROM dbo.Klienten
    WHERE (Geburtstag IS NOT NULL)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Nun habe ich mal nach der Methode TOP (n) mit n=1 - 109 durchgecheckt (OHNE PERCENT!!) und siehe da, in jeder Zeile gab es keinen Fehler. Habe dann letzten Endes TOP (110) durchgeführt - da kam der Fehler. Aber die letzte Zeile einer Sicht besteht doch immer aus NULL Spalten???
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    dherr schrieb:

    Zeile einer Sicht besteht doch immer aus NULL Spalten???
    Nö, das wär doch nichts als ärgerlich.
    Ein View ist eigentlich nur eine gespeicherte Abfrage, wenn die Abfrage keine Zeile mit NULL-Spalten returnt, soll der View das auch nicht zeigen.

    Und nur zur Klarstellung:
    Select Top 110 Geburtstag From Klienten Where Geburtstag Is Not Null returnt dir NULL in Zeile 110? Das macht keinen Sinn.

    Die Klammern in der Berechnung kann man glatt als Obfuskation verkaufen.
    Versuch mal so:

    SQL-Abfrage

    1. CONVERT(date, CONCAT_WS('-',
    2. Case When DATEPART(YEAR, GETDATE()) - CONVERT(int, '19' + SUBSTRING(versicherungsnummer,9,2)) >= 100 Then '20' Else '19' End + SUBSTRING(versicherungsnummer,9,2),
    3. SUBSTRING(versicherungsnummer,7,2),
    4. SUBSTRING(versicherungsnummer,5,2)))


    Nebenbei will ich auch mal fragen:
    Wie erhält man denn überhaupt eine Fehlermeldung in SSMS als MessageBox, und darüber hinaus dann dennoch ein Ergebnis? Bei mir sind das schlicht Meldungen in der Konsole und das fungiert generell gleichzeitig als Quittierung.
    1. Es muss heißen ...besteht aus NULL-Werten.
    2. Die vielen Klammern in der Formel werden vom Designer selbst gesetzt! (SSMS 19,2)
    3. Select Top(100) zeigt mir alle Zeilen der Sicht ohne Fehlermeldung, wenn ich dann 101 eingebe, kommt zum ersten Mal der Fehler.
    4. Deine letzte Frage: das läuft so bei meinem SSMS (SQLEXPRESS 2022). Das kenne ich nicht anders.

    Aber: Das Problem ist gelöst, und zwar habe ich mit Methode 3. entdeckt, dass eine unter der Menge der Versicherungsnummern einen Zahlendreher beim Monat hatte. Voila! Jetzt geht wieder alles1 Super

    Danke an alle, die mir hier mitgeholfen haben!!!
    Grüße - Dietrich

    dherr schrieb:

    dass eine unter der Menge der Versicherungsnummern einen Zahlendreher beim Monat hatte

    Nein! Doch! Ohh!
    Habe ich doch gesagt, prüfe die Daten und deine WHERE-Klausel schützt davor nicht, da die erst nach dem ganzen rumgebastel wirkt.