sql - SQL Server 将xml值作为空字符串读取

  显示原文与译文双语对照的内容
0 0

我有以下 C# 类


public class Data
{
 public string A {get;set;}
 public string B {get;set;}
 public string C {get;set;}
}

我在代码中创建了一个实例:


var d = new Data { A ="abc", B = string.Empty, C = null};

我需要将它的转换为XML并将它的传递到 SQL Server 2008中的sproc 。

我使用以下方法:


var xml = new XElement("Data",
 new XElement("A", d.A),
 new XElement("B", d.B),
 new XElement("C", d.C));

在sproc中生成的结果是:


<Data>
 <A>abc</A>
 <B></B>
 <C/>
</Data>

因此,空字符串与空值之间的区别是。

然后使用SQL对XML使用以下语法:


INSERT INTO #myTable
SELECT 
 nref.value('(A/text())[1]', 'uniqueidentifier') [A],
 nref.value('(B/text())[1]', 'uniqueidentifier') [B],
 nref.value('(C/text())[1]', 'uniqueidentifier') [C],
FROM @DataXml.nodes('/Data') AS R(nref);

但这为我提供了B 和C 都为空的值,其中B 应该为空字符串。

如何修改以确保空值保留为空,空字符串保留为空字符串?

谢谢

时间: 原作者:

0 0

XElement构造函数可以将空和空视为不同,但是XML规范认为 <X/> 和 <X> </X> 是相同的。 SQL Server XQuery同样对待它们。

如果希望 SQL Server 区分空的&空元素,则需要在构造 C# 代码的XML时完全排除null元素。 例如下面的元素将元素B 视为空&元素C,因为缺少它:


declare @x xml = 
'<Data><A>abc</A><B></B></Data>'

SELECT 
 nref.value('(A/text())[1]', 'varchar') [A],
 isnull(nref.value('(B/text())[1]', 'varchar'), case when nref.exist('./B') = 1 then '' end) [B],
 isnull(nref.value('(C/text())[1]', 'varchar'), case when nref.exist('./C') = 1 then '' end) [C]
FROM @x.nodes('/Data') AS R(nref);

...