【问题标题】:Replace “&lt;” and “&gt;” with “<” and “>” in sql server在sql server中将“<”和“>”替换为“<”和“>”
【发布时间】:2013-07-06 14:07:33
【问题描述】:

嗨,我是 xml 新手

我有这样的查询

SELECT  ProjectId, 
       ProjectCode, 
       ProjectName, 
       TechId, 
      -- LocationId, 

      ( SELECT GeoId,PoliticalDivisionId ,GeographicLocationName,IsoCode,Longitude,Latitude,ParentLocationId,
       t2.CreatedBy,t2.CreatedOn,t2.LastUpdatedBy,t2.LastUpdatedOn
    FROM GeographicLocation t2
    WHERE GeoId = t1.LocationId
    FOR XML  PATH('Location') ),
       RtoId, 
       CreatedBy,
       CreatedOn,
       LastUpdatedBy,
       LastUpdatedOn
FROM Project t1
where ProjectId=1
FOR XML PATH('ProjectInfo')

它将xml返回为

<ProjectInfo>
<ProjectId>1</ProjectId>
<ProjectCode>US-W1-00001</ProjectCode>
<ProjectName>Rees</ProjectName>
<TechId>1</TechId>
&lt;Location&gt;&lt;GeoId&gt;235&lt;/GeoId&gt;&lt;PoliticalDivisionId&gt;2&lt;/PoliticalDivisionId&gt;&lt;GeographicLocationName&gt;UNITED STATES&lt;/GeographicLocationName&gt;&lt;IsoCode&gt;US&lt;/IsoCode&gt;&lt;/Location&gt;
<RtoId>3</RtoId>
<CreatedBy>1</CreatedBy>
<CreatedOn>2013-06-30T20:55:21.587</CreatedOn>
<LastUpdatedBy>1</LastUpdatedBy>
<LastUpdatedOn>2013-06-30T20:55:21.587</LastUpdatedOn>

项目标签以 的形式显示。但是Location的内部标签显示为“”我如何用

替换它们

更新:问题中有一个小错误。内部 xml 不是用于 rtoid ,而是用于 Location

我将查询更新为

SELECT  ProjectId, 
       ProjectCode, 
       ProjectName, 
       TechId, 
      -- LocationId, 

      replace(replace( ( SELECT GeoId,PoliticalDivisionId ,GeographicLocationName,IsoCode,Longitude,Latitude,ParentLocationId,
       t2.CreatedBy,t2.CreatedOn,t2.LastUpdatedBy,t2.LastUpdatedOn
    FROM GeographicLocation t2
    WHERE GeoId = t1.LocationId
    FOR XML  PATH('Location') ), '&lt;', '<'), '&gt;', '>'),
       RtoId, 
       CreatedBy,
       CreatedOn,
       LastUpdatedBy,
       LastUpdatedOn
FROM Project t1
where ProjectId=1
FOR XML PATH('ProjectInfo')

但还是一样

【问题讨论】:

    标签: sql-server for-xml for-xml-path


    【解决方案1】:

    我认为正确的方法是使用TYPE Directive

    SELECT  ProjectId, 
            ...,
          ( SELECT Geo, ...
            FROM GeographicLocation t2
            WHERE GeoId = t1.LocationId
            FOR XML  PATH('Location'), TYPE),
           RtoId,                      ^^^^
           ...
    FROM Project t1
    where ProjectId=1
    FOR XML PATH('ProjectInfo') 
    

    【讨论】:

    • 这是正确的答案 - 我在上一家公司留下了所有旧代码,而这个答案让我无法摆脱困境。非常感谢!
    【解决方案2】:

    我发现的方法是明确替换它们:

    select ProjectId, ProjectCode, ProjectName, TechId,
           replace(replace(RtoId, '&lt;', '<'), '&gt;', '>') as RtoId, 
           . . .
    from (<your query here>)
    

    【讨论】:

      【解决方案3】:
          SELECT  ProjectId, 
             ProjectCode, 
             ProjectName, 
             TechId, 
            -- LocationId, 
            replace(replace(( SELECT GeoId,PoliticalDivisionId ,GeographicLocationName,IsoCode,Longitude,Latitude,ParentLocationId,
             t2.CreatedBy,t2.CreatedOn,t2.LastUpdatedBy,t2.LastUpdatedOn
          FROM GeographicLocation t2
          WHERE GeoId = t1.LocationId
          FOR XML  PATH('Location') ), '&lt;', '<'), '&gt;', '>')
             RtoId, 
             CreatedBy,
             CreatedOn,
             LastUpdatedBy,
             LastUpdatedOn
      FROM Project t1
      where ProjectId=1
      FOR XML PATH('ProjectInfo')
      

      【讨论】:

        【解决方案4】:

        请尝试:

        (SELECT GeoId,PoliticalDivisionId ,GeographicLocationName,IsoCode,
                Longitude,Latitude,ParentLocationId,
                t2.CreatedBy,t2.CreatedOn,t2.LastUpdatedBy,t2.LastUpdatedOn
            FROM GeographicLocation t2
            WHERE GeoId = t1.LocationId
                FOR XML  PATH('Location'), type
                ).value('(./text())[1]','varchar(max)')
        

        【讨论】:

        • 这个非常简单的答案(对 value 函数进行了微小的更改)让我可以连接一系列 XML 字符串而不会变得丑陋 gt;s 和 lt;s,我认为这种方法比做一个替换()。
        • 优秀的答案。有关 Value() 方法的更多信息:docs.microsoft.com/en-us/sql/t-sql/xml/… 也可以将参数 './text())[1]' 替换为简单的 '.'达到同样的效果。
        【解决方案5】:

        将数据格式化成xml,使用cast(@xml as xml)。

        【讨论】:

        • 这不适用于大型 XML 数据。对我来说,重放 < 最多只能输入 200 个字符。和>用 .
        【解决方案6】:
        SELECT ProjectId,
               ProjectCode, 
               ProjectName, 
               TechId, 
              -- LocationId, 
              cast(( SELECT GeoId,PoliticalDivisionId ,GeographicLocationName,IsoCode,Longitude,Latitude,ParentLocationId,
               t2.CreatedBy,t2.CreatedOn,t2.LastUpdatedBy,t2.LastUpdatedOn
            FROM GeographicLocation t2
            WHERE GeoId = t1.LocationId
            FOR XML  PATH('Location') ) as xml),
               RtoId, 
               CreatedBy,
               CreatedOn,
               LastUpdatedBy,
               LastUpdatedOn
        FROM Project t1
        where ProjectId=1
        FOR XML PATH('ProjectInfo')
        

        【讨论】:

          【解决方案7】:

          使用 FOR XML

          SELECT customerid 
            , name
            , SUBSTRING( x, 4, LEN( x) - 7)        AS name2
            , IIF( LEN(name) <> LEN(x) - 7, 1, 0)  AS residual 
          FROM (SELECT customerid
                  ,   name
                  ,   (SELECT kundnamn AS n FOR XML PATH('')) as x
                FROM customers
                ) s
          

          或

          declare @s varchar(MAX) = 'asd& < > " '' ='
          PRINT @s
          declare @xml varchar(MAX)
          SELECT @xml = SUBSTRING( x, 4, LEN( x) - 7)
          FROM (SELECT (SELECT @s AS x FOR XML PATH('')) AS x ) x
          PRINT @xml
          

          给予

          asd& < > " ' =
          asd&amp; &lt; &gt; " ' =
          

          【讨论】:

            猜你喜欢
            • 2019-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-08
            • 1970-01-01
            • 2013-05-26
            • 1970-01-01
            • 2020-06-20
            相关资源
            最近更新 更多