【问题标题】:How to handle blank values in FOR XML PATH/AUTO - SQL Server?如何处理 FOR XML PATH/AUTO - SQL Server 中的空白值?
【发布时间】:2014-05-16 16:39:06
【问题描述】:

是否有人对此 SQL Server 行为有任何见解或遇到过, 当空白值转换为数据类型“char”或具有“char”作为数据类型的列 - 使用For XML PATH 处理时,它返回带有“”特殊字符编码的 XML 结果,
当使用varchar 转换相同的空白值时 - 它返回空标签。我想要的结果是空标签。

SELECT field=CONVERT(CHAR(10),'')
FOR XML PATH(''), ELEMENTS
--RESULT: <field>          &#x20;</field>

SELECT field=CONVERT(VARCHAR(10),'')
FOR XML PATH(''), ELEMENTS
--RESULT: <field></field>

在我看来,解释是当我使用char 时,它会插入 10 个空格。 ASCII Hex20 或 Decimal 32 - 是空格的代码。

可以使用varchar代替char作为数据类型来处理。但就我而言,我正在从数据库中定义的表中读取字段值:

--Example:
CREATE TABLE #temp(field CHAR(2))

INSERT INTO #temp
SELECT NULL

SELECT field=ISNULL(field,'')
FROM #temp
FOR XML PATH('')

DROP TABLE #temp

--RESULT: <field>  &#x20;</field>
--Desired Result:<field></field>

SQL 中最优雅的方式/或可能性是什么?

PS:我有一个包含 50 列的结果集。我想在不更改类型的情况下在数据库级别处理此问题。真正的问题是我的 Web 服务在 XML 中遇到此字符时会引发潜在的危险值错误。

【问题讨论】:

  • 我发现当 SQL Server 存储 char 类型数据时,每个值末尾都会添加一个 0x0200,我认为这个十六进制会导致 ;)。

标签: sql-server xml special-characters


【解决方案1】:

我用于获得所需结果的解决方案是,一次投射整个结果 -

CREATE TABLE #temp(field CHAR(2))

INSERT INTO #temp
SELECT NULL

--Adding a cast to XML Result to convert it into varchar & then use replace.
SELECT REPLACE(CONVERT(VARCHAR(max),(SELECT field=ISNULL(field,'')
FROM #temp
FOR XML PATH(''))),'&#x20;','')

DROP TABLE #temp

想听听有没有其他建议?

【讨论】:

    【解决方案2】:

    您可以执行以下操作...如果您觉得需要 TRIM,则由您自己决定;

    CREATE TABLE #temp(field CHAR(2))
    
    INSERT INTO #temp
    SELECT NULL
    
    SELECT field=COALESCE(NULLIF(RTRIM(LTRIM(field)), ''), '')
    FROM #temp
    FOR XML PATH('')
    
    DROP TABLE #temp
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多