Tránh các ký tự được ủy quyền khi sử dụng FOR XML PATH để nối chuỗi


7

Tôi có truy vấn này:

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;

Nó tạo ra tập kết quả này:

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

Dữ liệu là chính xác, nhưng tôi không thể có FOR XML PATH('')vì nó thoát được một số ký tự đặc biệt.

Để rõ ràng, tôi đang sử dụng FOR XML PATH('')vì có thể các bản ghi có cùng tiêu đề CourseEventKeycó nhiều Facilitytiêu đề được liên kết với chúng.

Làm cách nào tôi có thể giữ lại dữ liệu được trả về bởi truy vấn này mà không cần sử dụng FOR XML PATH('')?


Nối chuỗi như thế này sẽ không bao giờ đẹp. Bạn không thể làm điều đó trong ứng dụng của bạn?
JNK

Tiếc là không có. Đây sẽ là một phần của quy trình được lưu trữ cho báo cáo và tôi có quyền kiểm soát rất hạn chế đối với những gì báo cáo đó thực hiện. Nó hoạt động tốt nhưng vấn đề DUY NHẤT là thoát khỏi các ký tự đặc biệt. @JNK
Kehlan Krumme

Câu trả lời:


14

Hãy thử thay đổi tuyên bố của bạn để phù hợp với điều này:

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

Điều này sử dụng .value xmlphương pháp để giải quyết vấn đề quyền lợi của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.