Как сохранить теги CDATA при сохранении результатов запроса в переменной XML? - PullRequest
5 голосов
/ 03 февраля 2012

Когда я генерирую Xml в Sql Server 2008 R2 с использованием For Explicit (поскольку мой потребитель хочет, чтобы один из элементов был заключен в CDATA) и сохранял результаты в переменной Xml, данные, которые я хочу заключить в теги CDATA, больше не отображаются вCDATA теги.Если я не помещаю результаты For Xml Explicit в переменную Xml, теги CDATA сохраняются.Я использую переменную @Xml в качестве SqlParameter из .Net.

В этом примере при первом выборе (Select @Xml) не строка 2 обернута в теги CDATA.Но при втором выборе (тот же запрос, который использовался для заполнения переменной @Xml) имеет теги CDATA, обертывающие столбец Line2.

Declare @Xml Xml

Begin Try
    Drop Table #MyTempTable
End Try
Begin Catch
End Catch

Select
    'Record' As Record
    , 'Line1' As Line1
    , 'Line2' As Line2
Into
    #MyTempTable

Select @Xml =
(
    Select
        x.Tag
        , x.Parent
        , x.[Root!1]
        , x.[Record!2!Line1!Element]
        , x.[Record!2!Line2!cdata]
    From
        (
            Select
                1 As Tag, Null As Parent
                , Null As [Root!1]
                , Null As [Record!2!Line1!Element]
                , Null As [Record!2!Line2!cdata]
            From
                #MyTempTable
            Union
            Select
                2 As Tag, 1 As Parent
                , Null As [Root!1]
                , Line1 As [Record!2!Line1!Element]
                , Line2 As [Record!2!Line2!cdata]
            From
                #MyTempTable
        ) x
    For
        Xml Explicit
)

Select @Xml

    Select
        x.Tag
        , x.Parent
        , x.[Root!1]
        , x.[Record!2!Line1!Element]
        , x.[Record!2!Line2!cdata]
    From
        (
            Select
                1 As Tag, Null As Parent
                , Null As [Root!1]
                , Null As [Record!2!Line1!Element]
                , Null As [Record!2!Line2!cdata]
            From
                #MyTempTable
            Union
            Select
                2 As Tag, 1 As Parent
                , Null As [Root!1]
                , Line1 As [Record!2!Line1!Element]
                , Line2 As [Record!2!Line2!cdata]
            From
                #MyTempTable
        ) x
    For
        Xml Explicit

Begin Try
    Drop Table #MyTempTable
End Try
Begin Catch
End Catch

1 Ответ

3 голосов
/ 03 февраля 2012

Вы не можете. Тип данных XML не сохраняет разделы CDATA.

Загляните сюда для обсуждения этой темы.

http://social.msdn.microsoft.com/forums/en-US/sqlxml/thread/e22efff3-192e-468e-b173-ced52ada857f/

...