为啥在 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
【问题讨论】:
ntext
、text
和 image
数据类型将在 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 我不明白。为什么你有一个参数,如果它总是为空?
我想使用一个全局变量,我可以在多个 BEGIN
和 END
语句中使用它。如果我向您发送部分代码,您能告诉我错误在哪里吗?它工作正常,不知道为什么现在不行。以上是关于为啥在 Sql 中修改 Xml 值时收到 Mutator 错误的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在尝试在 iOS Swift 中向服务器发出 post 请求时收到此错误:在展开 Optional 值时意外发现 nil?
为啥当 WHERE 子句包含参数化值时 SQL Server 使用索引扫描而不是索引查找