我想知道是否有办法可以通过一些配置xml参数从我的C#数据服务向存储过程发送NULL或DBNull.Value。
在proc中,我想从xml中提取一些值,但由于UI允许第三种状态,从xml进来的位值可以为NULL,在这种情况下我想忽略任何SQL该字段的更新。
XElement xml = new XElement("XML");
xml.Add(new XElement("SomeConfigValue", NULL));
当我从C#向xml中抛出NULL时,它默认为没有值的节点。
<SomeConfigValue />
当我尝试从SQL中抓取xml中的值时,该值被解释为0.
select isnull(@Configuration.value('/Configuration[1]/SomeConfigValue [1]', 'bit'), NULL)
这一切都很好,很好。这说得通。我只是好奇是否有人可以提出想法,我可以按照我希望的方式使用它。也许我不能依赖SQL位类型,但我目前正在重新分解为强类型。
如果输入的值不是1或0,我希望能够获取NULL。
set @SomeConfigValue = isnull(@Configuration.value('/Configuration[1]/SomeConfigValue [1]', 'bit'), NULL)
目标是忽略更新该值,如果它为NULL,或者在此特定SQL位类型的情况下不是1或0。
update MyTable
set ConfigValue =
case
when @SomeConfigValue IS NULL then T.SomeConfigValue
else @SomeConfigValue
end from SomeTable T
答案 0 :(得分:1)
这是标准xml序列化使用的方法 - IsNullable。 XElement没有类似的属性,但您可以自己添加属性“xsi:nil”,并在存储过程中对其进行测试。
答案 1 :(得分:1)
您可能想要查看
http://blogs.msdn.com/denisruc/archive/2006/11/30/xsi-nil-magic-part-1-2.aspx
和
http://blogs.msdn.com/denisruc/archive/2006/12/04/xsi-nil-magic-part-2-2.aspx
在SQL Server 2005中讨论xsi:nil magic