我有以下存储过程:
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’上的变量’modify()’不能在空值上调用。
我该如何解决该错误。我试图更新XML值的列(chtml),这是类型ntext的TC表。
chtml
ntext
TC
如果需要提供更多信息,请告诉我。
只是为了测试代码,我只是尝试了以下方法,但仍然给出了相同的错误:
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
NOT WORK
原始列(chtml)数据:
<?xml version="1.0" encoding="UTF-8"?> <root> <Phys> <gender>M</gender> </Phys> </root>
执行上述SP后,gender应该是F和不是M
gender
F
M
该错误实际上说明了一切,@XML为null,这是不允许的。
@XML
复制:
declare @X xml; set @X.modify('replace value of text()[1] with "1"');
消息5302,级别16,状态1,第4行’@X’上的变量’modify()’不能在空值上调用。
在修改之前,请检查是否为空。
declare @X xml; if @X is not null set @X.modify('replace value of text()[1] with "1"');