Mehrere Zeilen in einer einzigen ausgeben lassen



  • Hallo,

    ich komme einfach nicht mehr weiter...

    Ich habe eine VIEW "V_ObjectProperty" mit folgenden Daten

    V_ObjectProperty(int, varchar)
    Object_ID | Value
    1 | 2
    2 | 3
    2 | 3.5
    3 | Test
    3 | 300

    ..und möchte diese so ausgeben lassen:

    Object_ID | Value
    1 | 2
    2 | 3; 3.5
    3 | Test; 300

    .. das funktioniert auch soweit, nur...
    Sobald ich "WHERE v1.Object_ID <= 24"
    schreibe, sagt er mir: "Meldung 245, Ebene 16, Status 1, Zeile 1
    Fehler beim Konvertieren des varchar-Werts '3.5' in den int-Datentyp.
    " 😡

    Bei "WHERE v1.Object_ID <= 23" funktioniert es wieder 1A 😮 😮
    Das Objekt mit der Object_ID 24 hätte als Value 25

    Achja, das ganze gebe ich mit folgendem Code aus:

    SELECT DISTINCT v1.Object_ID,
    STUFF((SELECT '; ' + v2.Value 
    	FROM V_ObjectProperty v2
        WHERE v2.Object_ID = v1.Object_ID
        FOR XML PATH('')), 1, 1, '') [Values]
    FROM V_ObjectProperty v1
    WHERE v1.Object_ID <= 23
    GROUP BY v1.Object_ID
    

    Warum versucht er mir diese '3.5' in ein INT zu casten 😕, und vor allem, warum funktionieren die ersten 23 Objekte 😕 😕



  • sooo, es gibt neue Erkenntnisse 🕶

    bei Verwendung von..

    Declare @Table Table
    (
    Id int,
    Value varchar(255)
    )

    ..und das hinzufügen der Daten (Object_ID, Value) mittels INSERT INTO kommt keine Error-Message!!!
    Problem ist allerdings, ich kann keine View erstellen solange ein Declare darin enthalten ist. Und diese in eine Function zu packen ist von der Performance her fürn Arsch.

    Liegt dieser Konvertierungsfehler etwa am View ?



  • Problem behoben!

    Es lag tatsächlich am View.
    Musste den INDEX im INNER JOIN, der als varchar vorliegt, aber als float-Wert gespeichert wurde ('3.5') erst zu einem float, dann zu einem int casten, da vor der WHERE-Operation im Zusammenhang mit einem UNION erst die JOIN-Operation ausgeführt wird.

    Interessant ist hierbei wie SQL dabei reagiert, da der Fehler zufällig auftritt, je nachdem wie viele Einträge man in der Tabelle bereits gespeichert hat.

    Beispiel anhand eines INSERTs und anschließendem SELECT:
    INSERT INTO: row 1-20 -> SELECT * [OK]
    INSERT INTO: row 21-50 -> SELECT * [ERROR]
    CLEAR
    INSERT INTO: row 1-50 -> SELECT * [OK]
    CLEAR
    INSERT INTO: row 1-1000 -> SELECT * [ERROR]
    CLEAR
    INSERT INTO: row 1-50 -> SELECT * [ERROR]

    Warum allerdings eine deklarierte Table mit int/varchar wie im vorherigem Beitrag beschrieben funktioniert, bleibt mir schleierhaft


Anmelden zum Antworten