xml - 在 Xml 变量中存储查询结果时如何保留 CDATA 标记?

标签 xml sql-server-2008 cdata

当我在 Sql Server 2008 R2 中使用 For Explicit 生成 Xml(因为我的消费者想要包装在 CDATA 中的元素之一)并将结果存储在 Xml 变量中时,我想要包装在 CDATA 标记中的数据不再显示为包装在CDATA 标签。如果我不将 For Xml Explicit 结果推送到 Xml 变量中,那么 CDATA 标签将被保留。我将 @Xml 变量用作 .Net 中的 SqlParameter。

在此示例中,第一个选择 (Select @Xml) 没有将 Line2 包装在 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

最佳答案

你不能。 XML 数据类型不保留 CDATA 部分。

在此处查看有关该主题的讨论。

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

关于xml - 在 Xml 变量中存储查询结果时如何保留 CDATA 标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9132133/

相关文章:

python - OpenCV 3.0.0 测试版 Python : Load error: 'module' object has no attribute 'Load'

c# - 如何将 CDATA 与从 xsd.exe 生成的 C# 类一起使用?

c# - SQL Server 2008 FTS 问题,最好的选择

sql - SQL Server 连接是否加密?

xml - 我如何在不结束该部分的情况下在 CDATA 部分中写入文字 "]]>"

jquery - 从 <![CDATA []]> 中提取内容

xml - 如何使用 shell 脚本读取 XML 并写入文本文件?

c# - 用ID修改节点值C#

iphone - 将 Flash 动画转换为 Cocos2D

sql - 我可以从表中选择一组行并将其直接插入到一个表或 SQL 中的同一个表中吗?