如何仅使用 Xpath 从 SQL Server 中的空 XML 标记返回空值?

Tim*_*man 9 xml sql-server-2008-r2

我有一个应用程序,用于存储有关 XML 列中记录的各种用户定义的数据点。我无法控制这些是如何存储或更新的。

当我查询一列时,它可以返回 3 个值中的 1 个:

  1. 价值
  2. 空值
  3. 空字符串

$64 问题我想使用 xpath 将这些空字符串作为空值返回。

我找到了很多关于将 null 作为空字符串返回的答案,但没有这样的方法。

当有人删除该值时,他们会以这种方式结束,而不是删除标签,而是将其空白到一个<value />标签。当从未设置值时会出现空值。他们没有包括 xsi:nil。

我已经用 case 语句完成了它:

    select
    so.SalesOrderId,
    Case
        when sopc.value('(Value)[1]','smalldatetime') IS null then Null
        when sopc.value('(Value)[1]','smalldatetime') ='' then Null
        Else sopc.value('(Value)[1]','smalldatetime')
    End as sopc
    From
    SalesOrders so
    Outer apply so.CustomColumns.nodes('/CustomColumnsCollection/CustomColumn[Name="ProjCompleted"]') sopc(sopc)
Run Code Online (Sandbox Code Playgroud)

但这感觉效率低下,而且这不是唯一的列,因此它使代码变得冗长且难以维护。

编辑以包含示例数据

SalesOrderId    CustomColumns
SO 1            "<CustomColumnsCollection>
                   <CustomColumn>
                     <Name>ProjCompleted</Name>
                     <DataType>1</DataType>
                     <Value />
                   </CustomColumn>
                 </CustomColumnsCollection>"
SO 2           "<CustomColumnsCollection>
                  <CustomColumn>
                     <Name>ProjCompleted</Name>
                     <DataType>1</DataType>
                     <Value>'2017-11-21'</Value>
                  </CustomColumn>
                </CustomColumnsCollection>"
SO 3           "<CustomColumnsCollection>
                </CustomColumnsCollection>"

**Output**
Current      Desired
''           null
2017-11-21   2017-11-21
null         null
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Mik*_*son 13

指定元素text()内的节点Value。当您有一个空标签时,该节点将丢失。

尝试这个:

declare @X xml;
set @X = '<Value/>';

select @X.value('(Value/text())[1]', 'smalldatetime'),
       @X.value('(Value/text())[1]', 'varchar(max)'),
       @X.value('(Value/text())[1]', 'int'),
       @X.value('(Value)[1]', 'smalldatetime'),
       @X.value('(Value)[1]', 'varchar(max)'),
       @X.value('(Value)[1]', 'int');
Run Code Online (Sandbox Code Playgroud)

结果:

------------------- ---------- ----------- ----------------------- ---------- -----------
NULL                NULL       NULL        1900-01-01 00:00:00                0
Run Code Online (Sandbox Code Playgroud)

通常总是指定text()节点是一件好事。查询计划更简单,更高效。

在此处输入图片说明