Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从SQL变量更新多个XML元素_Sql_Sql Server_Xml - Fatal编程技术网

从SQL变量更新多个XML元素

从SQL变量更新多个XML元素,sql,sql-server,xml,Sql,Sql Server,Xml,我需要用TSQL变量的内容更新XML元素中的值。增加的复杂性是可能有多个同名元素,所有元素都需要更新。这是一个样本。请注意,customer 1000000有两个customer_firstname元素 CREATE TABLE Customer_Test ( [customer_data] [xml] NULL ) -- populate statements insert into Customer_Test (customer_data) values ('<Custom

我需要用TSQL变量的内容更新XML元素中的值。增加的复杂性是可能有多个同名元素,所有元素都需要更新。这是一个样本。请注意,customer 1000000有两个customer_firstname元素

CREATE TABLE Customer_Test
(
    [customer_data] [xml] NULL
) 

-- populate statements
insert into Customer_Test (customer_data) values ('<Customer Note="two customer_firstnames"><customer_id>1000000</customer_id><customer_firstname>Mary</customer_firstname><customer_firstname>Jane</customer_firstname><customer_lastname>Smith</customer_lastname></Customer>');
insert into Customer_Test (customer_data) values ('<Customer Note="normal, no problem"><customer_id>1000001</customer_id><customer_firstname>Joe</customer_firstname><customer_lastname>Bloggs</customer_lastname></Customer>');
我真的被困在这个问题上了——我需要将customer_firstname元素的所有值设置为相同的值(如果它们存在的话)。我有点怀疑交叉应用是必需的,但我编写一个交叉应用的所有尝试都无法编译


我非常重视可能提供的任何建议。提前感谢。

用一条update语句更新XML中的多个值是不可能的

您可以在while循环中完成,该循环迭代一个XML中的名字数

声明@newName varchar10='xxx' 声明@IDValue varchar10='1000000' 声明@FirstNameCount INT -获取一个XML中名字的最大数目 选择@FirstNameCount=maxcustomer\u data。值为'countCustomer/customer\u firstname','int' 来自客户测试 其中customer_data.value'/customer/customer_id[1],'varchar50'=@IDValue -在@FirstNameCoount上循环 而@firstnamecont>0 开始 更新[客户测试] 设置客户数据。修改“替换客户/customer\u firstname的值[sql:variable@FirstNameCount]/带sql的文本[1]:variable@newName' 其中customer_data.value'/customer/customer_id[1],'varchar50'=@IDValue 设置@FirstNameCount=@FirstNameCount-1 终止
在这一点上消除XML的重复难道不值得吗?如果将所有值设置为同一个值,那么存储第二个名称就没有意义了。您可以根据位置删除第二个customer_firstname元素,例如

SELECT 'before' s, DATALENGTH( customer_data ) dl, [customer_data] FROM Customer_Test

UPDATE [Customer_Test]
SET  customer_data.modify('delete Customer/customer_firstname[position() > 1]')  

SELECT 'after 1' s, DATALENGTH( customer_data ) dl, [customer_data] FROM Customer_Test

DECLARE @newName varchar(10) = 'xxx' 
DECLARE @IDValue varchar(10) = '1000000' 
UPDATE [Customer_Test]
SET  customer_data.modify('replace value of (Customer/customer_firstname/text())[1] with sql:variable("@newName")')  
WHERE  customer_data.value('(/Customer/customer_id)[1]','varchar(50)') = @IDValue 

SELECT 'after 2' s, DATALENGTH( customer_data ) dl, [customer_data] FROM Customer_Test
SELECT 'before' s, DATALENGTH( customer_data ) dl, [customer_data] FROM Customer_Test

UPDATE [Customer_Test]
SET  customer_data.modify('delete Customer/customer_firstname[position() > 1]')  

SELECT 'after 1' s, DATALENGTH( customer_data ) dl, [customer_data] FROM Customer_Test

DECLARE @newName varchar(10) = 'xxx' 
DECLARE @IDValue varchar(10) = '1000000' 
UPDATE [Customer_Test]
SET  customer_data.modify('replace value of (Customer/customer_firstname/text())[1] with sql:variable("@newName")')  
WHERE  customer_data.value('(/Customer/customer_id)[1]','varchar(50)') = @IDValue 

SELECT 'after 2' s, DATALENGTH( customer_data ) dl, [customer_data] FROM Customer_Test