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