为啥在 Sql 中修改 Xml 值时收到 Mutator 错误

Posted

技术标签:

【中文标题】为啥在 Sql 中修改 Xml 值时收到 Mutator 错误【英文标题】:Why do I receive a Mutator error when modifying an Xml value in Sql为什么在 Sql 中修改 Xml 值时收到 Mutator 错误 【发布时间】:2015-10-06 16:12:11 【问题描述】:

我有以下存储过程:

ALTER PROCEDURE [dbo].[UpPro]
(
    @PN varchar(200),
    @xml xml,
    @gVa varchar(10),
)
AS
/* update the gender */
BEGIN
    SET NOCOUNT ON;

    Select @gVa = t1.[Gender] 
    From [myDb].[dbo].[myTable1] t1 --replace Value2 and table to the table which is updated through SSIS
    Where t1.Name = @PN

    PRINT @gVa //displays 'F'

    Set @xml.modify('replace value of (/root/Phys/gender/text())[1] with sql:variable("@gVa")');
END

/* once all the node has been "temporarily" changed, update the table columns for the provider */
BEGIN
    --update the table after casting dummy xml variable
    Update [myDb].[dbo].[TC]
    Set [chtml] = cast(cast(@xml as nvarchar(max)) as ntext)
    Where [ctitle] = @PN
END

当我运行查询时,我收到以下错误:

消息 5302,第 16 级,状态 1,程序 UpPro,第 115 行 '@xml' 上的 Mutator 'modify()' 不能在 null 值上调用。

我该如何解决这个错误。我正在尝试更新 TC 表中 ntext 类型的列 (chtml) 中的 xml 值。

如果我需要提供更多信息,请告诉我。

只是为了测试代码,我只是尝试了以下,它仍然给出了同样的错误:

DECLARE @gVa varchar(10)
DECLARE @xml xml

Select @gVa = t1.[Gender] 
From [myDb].[dbo].[myTable1] t1 --replace Value2 and table to the table which is updated through SSIS
Where t1.Name = 'Doctor 1'
PRINT @gVa

If @xml IS NOT NULL
BEGIN
    Set @xml.modify('replace value of (/root/Phys/gender/text())[1] with sql:variable("@gVa")');
END
Else
BEGIN
    PRINT 'NOT WORK'
END

继续打印NOT WORK

原始列(chtml)数据:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <Phys>
        <gender>M</gender>
    </Phys>
</root>

上述SP执行后,gender应该是F而不是M

【问题讨论】:

ntexttextimage 数据类型将在 SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用nvarchar(max)varchar(max)varbinary(max)。 See details here 如果您的数据是 XML - 为什么不使用 XML 数据类型来存储它?它比“简单”varchar 甚至更糟糕:ntext @marc_s 感谢您的回复。不幸的是,它是一个仍在使用ntext 的 CMS,因此我将它放在最后。我的修改语句应该可以正常工作,因为那里有一个值而不是空值。 【参考方案1】:

错误实际上说明了一切,@XML 为 null,这是不允许的。

复制:

declare @X xml;

set @X.modify('replace value of text()[1] with "1"');

消息 5302,级别 16,状态 1,第 4 行 '@X' 上的 Mutator 'modify()' 不能 在 null 值上调用。

在修改之前检查 null。

declare @X xml;

if @X is not null
  set @X.modify('replace value of text()[1] with "1"');

【讨论】:

我在存储过程中有更多@X.modify(),这是第一个。我必须每次检查还是第一次检查?顺便说一句,这奏效了。谢谢。 其实没关系,它没有工作。我不再收到错误消息,但它永远不会执行 .modify() 语句。我更新了我的问题。 存储过程第一次执行时,@xml 始终为空,因为其中还没有任何内容。我刚刚意识到,你在我最后一个关于这个问题的问题上帮助了我。 :) @SiKni8 我不明白。为什么你有一个参数,如果它总是为空? 我想使用一个全局变量,我可以在多个 BEGINEND 语句中使用它。如果我向您发送部分代码,您能告诉我错误在哪里吗?它工作正常,不知道为什么现在不行。

以上是关于为啥在 Sql 中修改 Xml 值时收到 Mutator 错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥我收到错误:致命错误:在展开可选值时意外发现 nil?

为啥我在尝试在 iOS Swift 中向服务器发出 post 请求时收到此错误:在展开 Optional 值时意外发现 nil?

为啥当 WHERE 子句包含参数化值时 SQL Server 使用索引扫描而不是索引查找

为啥在计算整数数组的最小值时会出现“实际或形式参数列表长度不同”的错误?

尝试在 SQL 中插入多个值时如何修复语句结尾?

为啥我在 XML 反序列化函数中收到此错误?