【问题标题】:Is there a way I can send a NULL value to a SQL stored proc through XML?有没有办法通过 XML 将 NULL 值发送到 SQL 存储过程?
【发布时间】:2009-06-26 18:31:43
【问题描述】:

我想知道是否有一种方法可以通过一些配置 xml 参数将 NULL 或 DBNull.Value 从我的 C# 数据服务发送到存储过程。

在 proc 中,我想稍微从 xml 中提取一些值,但是由于 UI 允许第三种状态,因此从 xml 传入的位值可以为 NULL,在这种情况下,我想忽略任何 SQL该字段的更新。

        XElement xml = new XElement("XML");
        xml.Add(new XElement("SomeConfigValue", NULL));

似乎当我从 C# 向 xml 中抛出一个 NULL 时,它默认为一个没有值的节点。

<SomeConfigValue />

当我尝试从 xml 中获取值作为 SQL 中的位时,该值被解释为 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

【问题讨论】:

  • 不应该有一个关于如何做到这一点的标准吗?

标签: sql xml sql-server-2005 null


【解决方案1】:

这里是标准 xml 序列化使用的方法 - IsNullable。 XElement 没有类似的属性,但是您可以自己添加属性“xsi:nil”,并在存储过程中对其进行测试。

【讨论】:

  • 你是在建议我做这样的事情吗? xml.Element("NotificationId").Add(new XAttribute("xsi:nil", true));我不确定我是否必须遵循该属性名称的标准,但我收到一个异常,表明我不能在属性名称中使用冒号。
  • 这是因为 'xsi' 是命名空间,只有 'nil' 是属性名。阅读更多 - w3.org/TR/xmlschema-1/#xsi_nil
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
相关资源
最近更新 更多