Vermeiden Sie berechtigte Zeichen, wenn Sie FOR XML PATH für die Verkettung von Zeichenfolgen verwenden

7

Ich habe diese Frage:

SELECT DISTINCT
    f1.CourseEventKey,
    STUFF
    (
        (
            SELECT
                '; ' + Title
            FROM
            (
                SELECT DISTINCT
                    ces.CourseEventKey,
                    f.Title
                FROM
                    CourseEventSchedule ces
                INNER JOIN Facility f 
                    ON f.FacilityKey = ces.FacilityKey
                WHERE
                    ces.CourseEventKey IN 
                    (
                        SELECT CourseEventKey
                        FROM @CourseEvents
                    )
            ) f2
            WHERE
                f2.CourseEventKey = f1.CourseEventKey
            FOR XML PATH('')
        )
    , 1, 2, '')
FROM
(
    SELECT DISTINCT
        ces.CourseEventKey,
        f.Title
    FROM
        CourseEventSchedule ces
    INNER JOIN Facility f 
        ON f.FacilityKey = ces.FacilityKey
    WHERE
        ces.CourseEventKey IN 
        (
            SELECT CourseEventKey
            FROM @CourseEvents
        )
) f1;

Es erzeugt diese Ergebnismenge:

CourseEventKey Titles
-------------- ----------------------------------
29             Test Facility 1
30             Memphis Training Room
32             Drury Inn & Suites Creve Coeur

Die Daten sind korrekt, aber ich kann sie nicht haben, FOR XML PATH('')da sie bestimmten Sonderzeichen entgehen.

Um es klar auszudrücken, verwende ich, FOR XML PATH('')weil es möglich ist, dass Datensätzen mit demselben Titel CourseEventKeymehrere FacilityTitel zugeordnet sind.

Wie kann ich die von dieser Abfrage zurückgegebenen Daten ohne Verwendung beibehalten FOR XML PATH('')?

Kehlan Krumme
quelle
Eine solche String-Verkettung wird niemals schön sein. Kannst du das nicht in deiner App machen?
JNK
Unglücklicherweise nicht. Dies wird Teil einer gespeicherten Prozedur für einen Bericht sein, und ich habe nur sehr begrenzte Kontrolle darüber, was dieser Bericht tut. Es funktioniert gut, aber das EINZIGE Problem ist das Entkommen von Sonderzeichen. @JNK
Kehlan Krumme

Antworten:

14

Versuchen Sie, Ihre Aussage so zu ändern, dass sie dieser entspricht:

FOR XML PATH(''), TYPE).value('(./text())[1]','varchar(max)')

Dies verwendet die .value xmlMethode , um Ihr Berechtigungsproblem zu lösen.

Mark Wilkinson
quelle