Tim*_*man 9 xml sql-server-2008-r2
我有一个应用程序,用于存储有关 XML 列中记录的各种用户定义的数据点。我无法控制这些是如何存储或更新的。
当我查询一列时,它可以返回 3 个值中的 1 个:
$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()
节点是一件好事。查询计划更简单,更高效。
归档时间: |
|
查看次数: |
9196 次 |
最近记录: |