2016-05-09 22 views
1

xml列 'Data'を持つテーブルがあります。私の要件は、コードを宣伝する際にUriとInstanceNameの属性を変更することです。私は仕事をするために更新文の下に書きました。私が実行すると、1行は影響を受けていますが、残念ながらそれは何も更新していません。どんな助力も高く評価されます。ありがとう!名前空間でSQL ServerのXML属性を更新します。

CREATE TABLE [dbo].[Test_TBD](
    [Id] [int] NULL, 
    [Data] [xml] NULL 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

WITH XMLNAMESPACES(DEFAULT 'http://www.tech.com/datafeed/dfx/2010/04') 
UPDATE Test_TBD set 
Data.modify('replace value of (/DataFeed/Transporter/ArcherWebServiceTransportActivity/@Uri)[1] with "https://arcs-x"'); 

UPDATE Test_TBD set 
Data.modify('replace value of (/DataFeed/Transporter/ArcherWebServiceTransportActivity/@InstanceName)[1] with "ARCS-X"'); 

ここに、データ列のサンプルデータがあります。

'<DataFeed xmlns="http://www.tech.com/datafeed/dfx/2010/04" xmlns:plugin="pluginExtensions" Type="TODO" Guid="TODO" UserAccount="DF_LEAN_PopulateCommentsSubForm" Locale="en-US" DateFormat="" ThousandSeparator="" NegativeSymbol="" DecimalSymbol="" SendingNotifications="false" SendJobStatusNotifications="false" RecipientUserIds="" RecipientGroupIds="" RecipientEmailAddresses="" Name="CI_C11.01_Lean-Lean_Reject Comments_A2A" > 
     <Transporter> 
     <transporters:ArcherWebServiceTransportActivity xmlns:transporters="clr-namespace:ArcherTech.DataFeed.Activities.Transporters;assembly=ArcherTech.DataFeed" xmlns:out="clr-namespace:ArcherTech.DataFeed;assembly=ArcherTech.DataFeed" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:compModel="clr-namespace:ArcherTech.DataFeed.ComponentModel;assembly=ArcherTech.DataFeed" xmlns:channel="clr-namespace:ArcherTech.DataFeed.Engine.Channel;assembly=ArcherTech.DataFeed" xmlns:engine="clr-namespace:ArcherTech.DataFeed.Engine;assembly=ArcherTech.DataFeed" xmlns:kernel="clr-namespace:ArcherTech.Kernel.Channel;assembly=ArcherTech.Kernel" xmlns="clr-namespace:ArcherTech.DataFeed;assembly=ArcherTech.DataFeed" xmlns:schema="clr-namespace:System.Xml.Schema;assembly=System.Xml" xmlns:xmlLinq="clr-namespace:System.Xml.Linq;assembly=System.Xml" xmlns:domain="clr-namespace:ArcherTech.Common.Domain;assembly=ArcherTech.Common" xmlns:s="clr-namespace:System;assembly=mscorlib" x:Key="transportActivity" SearchType="ReportId" Uri="https://arcs-d" RecordsPerFile="100" ReportID="EC514865-88D5-49CE-A200-7769EC1C2A88" UseWindowsAuth="false" IsWindowsAuthSpecific="false" WindowsAuthUserName="i9XzCczAQ7J2rHwkg6wG9QF8+O9NCYJZP6y5Kzw4be0+cdvUaGu/9+rHuLstU736pnQrRcwmnSIhd6oPKIvnLA==" WindowsAuthPassword="+y0tCAKysxEMSGv1unpHxfg6WjH5XWylgP45P5MLRdQ6+zAdOLSVy7s3KJa3+9j2i83qn8I8K7+1+QBlCJT1E7sLQHWRFOCEdJgXaIr1gWfUEO+7kjuJnZcIEKZJa2wHyqc2Z08J2SKfdCLh7HoLtg==" WindowsAuthDomain="" ProxyName="" ProxyPort="8080" ProxyUsername="" ProxyPassword="" ProxyDomain="" IsProxyActive="False" ProxyOption="None" InstanceName="ARCS-D" TempFileOnSuccessAction="DoNothing" TempFileOnSuccessRenameString="" TempFileOnErrorAction="DoNothing" TempFileOnErrorRenameString="" Transform="{engine:DataFeedBinding Path=Transform}" SessionContext="{engine:DataFeedBinding Path=Session}"> 
      <transporters:ArcherWebServiceTransportActivity.Credentials> 
      <NetworkCredentialWrapper UserName="TeSZmI1SqO0eJ0G2nDVU+glFg/9eZfeMppYQnPfbeg8=" Password="Slt4VHqjkYscWyCwZK40QJ7KOQroG9OTKr+RGt9bQjE=" /> 
      </transporters:ArcherWebServiceTransportActivity.Credentials> 
     </transporters:ArcherWebServiceTransportActivity> 
     </Transporter> 
    </DataFeed>' 
+0

私は/データフィード/ Transporterを/交換しましたArcherWebServiceTransportActivity/@ Uri/DataFeed/Transporter/*/@ Uriはすべてを選択して検証するだけで正常に動作しています。このような状況ではうまくいくかもしれませんが、希望のノードを選択して更新したいと思います。何が欠けているのかをお伝えください。ありがとう。 – redsam

答えて

2

あなたは両方のあなたの更新ステートメントでWITH XMLNAMESPACESを使用する必要があるとあなたはtransporters:ArcherWebServiceTransportActivityノードの名前空間
clr-namespace:ArcherTech.DataFeed.Activities.Transporters;assembly=ArcherTech.DataFeed
を使用する必要があります。

WITH XMLNAMESPACES(DEFAULT 'http://www.tech.com/datafeed/dfx/2010/04', 
        'clr-namespace:ArcherTech.DataFeed.Activities.Transporters;assembly=ArcherTech.DataFeed' as t) 
UPDATE Test_TBD set 
Data.modify('replace value of (/DataFeed/Transporter/t:ArcherWebServiceTransportActivity/@Uri)[1] with "https://arcs-x"'); 

WITH XMLNAMESPACES(DEFAULT 'http://www.tech.com/datafeed/dfx/2010/04', 
        'clr-namespace:ArcherTech.DataFeed.Activities.Transporters;assembly=ArcherTech.DataFeed' as t) 
UPDATE Test_TBD set 
Data.modify('replace value of (/DataFeed/Transporter/t:ArcherWebServiceTransportActivity/@InstanceName)[1] with "ARCS-X"'); 
+0

それは魅力のように動作します。助けてくれてありがとう。 – redsam

+1

こんにちはミカエル、これも私のアプローチでした。私が小さな反対意見を述べる唯一のポイントは、他にも解決策があるので、 'WITH XMLNAMESPACES' *を使う必要があるということです。 – Shnugo

2

あなたはすでに答えWITH XMLNAMESPACESを発見したとしてだけcompletnessのために、他のアプローチは、そこにもある(しかし確かに、私はMikaels提案となるだろう)

DECLARE @xml XML= 
'<DataFeed xmlns="http://www.tech.com/datafeed/dfx/2010/04" xmlns:plugin="pluginExtensions" Type="TODO" Guid="TODO" UserAccount="DF_LEAN_PopulateCommentsSubForm" Locale="en-US" DateFormat="" ThousandSeparator="" NegativeSymbol="" DecimalSymbol="" SendingNotifications="false" SendJobStatusNotifications="false" RecipientUserIds="" RecipientGroupIds="" RecipientEmailAddresses="" Name="CI_C11.01_Lean-Lean_Reject Comments_A2A" > 
     <Transporter> 
     <transporters:ArcherWebServiceTransportActivity xmlns:transporters="clr-namespace:ArcherTech.DataFeed.Activities.Transporters;assembly=ArcherTech.DataFeed" xmlns:out="clr-namespace:ArcherTech.DataFeed;assembly=ArcherTech.DataFeed" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:compModel="clr-namespace:ArcherTech.DataFeed.ComponentModel;assembly=ArcherTech.DataFeed" xmlns:channel="clr-namespace:ArcherTech.DataFeed.Engine.Channel;assembly=ArcherTech.DataFeed" xmlns:engine="clr-namespace:ArcherTech.DataFeed.Engine;assembly=ArcherTech.DataFeed" xmlns:kernel="clr-namespace:ArcherTech.Kernel.Channel;assembly=ArcherTech.Kernel" xmlns="clr-namespace:ArcherTech.DataFeed;assembly=ArcherTech.DataFeed" xmlns:schema="clr-namespace:System.Xml.Schema;assembly=System.Xml" xmlns:xmlLinq="clr-namespace:System.Xml.Linq;assembly=System.Xml" xmlns:domain="clr-namespace:ArcherTech.Common.Domain;assembly=ArcherTech.Common" xmlns:s="clr-namespace:System;assembly=mscorlib" x:Key="transportActivity" SearchType="ReportId" Uri="https://arcs-d" RecordsPerFile="100" ReportID="EC514865-88D5-49CE-A200-7769EC1C2A88" UseWindowsAuth="false" IsWindowsAuthSpecific="false" WindowsAuthUserName="i9XzCczAQ7J2rHwkg6wG9QF8+O9NCYJZP6y5Kzw4be0+cdvUaGu/9+rHuLstU736pnQrRcwmnSIhd6oPKIvnLA==" WindowsAuthPassword="+y0tCAKysxEMSGv1unpHxfg6WjH5XWylgP45P5MLRdQ6+zAdOLSVy7s3KJa3+9j2i83qn8I8K7+1+QBlCJT1E7sLQHWRFOCEdJgXaIr1gWfUEO+7kjuJnZcIEKZJa2wHyqc2Z08J2SKfdCLh7HoLtg==" WindowsAuthDomain="" ProxyName="" ProxyPort="8080" ProxyUsername="" ProxyPassword="" ProxyDomain="" IsProxyActive="False" ProxyOption="None" InstanceName="ARCS-D" TempFileOnSuccessAction="DoNothing" TempFileOnSuccessRenameString="" TempFileOnErrorAction="DoNothing" TempFileOnErrorRenameString="" Transform="{engine:DataFeedBinding Path=Transform}" SessionContext="{engine:DataFeedBinding Path=Session}"> 
      <transporters:ArcherWebServiceTransportActivity.Credentials> 
      <NetworkCredentialWrapper UserName="TeSZmI1SqO0eJ0G2nDVU+glFg/9eZfeMppYQnPfbeg8=" Password="Slt4VHqjkYscWyCwZK40QJ7KOQroG9OTKr+RGt9bQjE=" /> 
      </transporters:ArcherWebServiceTransportActivity.Credentials> 
     </transporters:ArcherWebServiceTransportActivity> 
     </Transporter> 
    </DataFeed>'; 


SELECT 'original: ' + @xml.value('(/*:DataFeed/*:Transporter/*:ArcherWebServiceTransportActivity/@Uri)[1]','varchar(max)') + '/' + @xml.value('(/*:DataFeed/*:Transporter/*:ArcherWebServiceTransportActivity/@InstanceName)[1]','varchar(max)'); 

--namespaces declared as part of the XML_DML 
SET @xml.modify('declare namespace ns="http://www.tech.com/datafeed/dfx/2010/04"; 
       declare namespace t="clr-namespace:ArcherTech.DataFeed.Activities.Transporters;assembly=ArcherTech.DataFeed"; 
       replace value of (/ns:DataFeed/ns:Transporter/t:ArcherWebServiceTransportActivity/@Uri)[1] with "https://arcs-x"'); 

--The Uri is changed 
SELECT 'declared: ' + @xml.value('(/*:DataFeed/*:Transporter/*:ArcherWebServiceTransportActivity/@Uri)[1]','varchar(max)') + '/' + @xml.value('(/*:DataFeed/*:Transporter/*:ArcherWebServiceTransportActivity/@InstanceName)[1]','varchar(max)'); 

--namespace tricked out with the "*" 
SET @xml.modify('replace value of (/*:DataFeed/*:Transporter/*:ArcherWebServiceTransportActivity/@InstanceName)[1] with "ARCS-X"'); 

--The InstanceName changed 
SELECT 'asterisk: ' + @xml.value('(/*:DataFeed/*:Transporter/*:ArcherWebServiceTransportActivity/@Uri)[1]','varchar(max)') + '/' + @xml.value('(/*:DataFeed/*:Transporter/*:ArcherWebServiceTransportActivity/@InstanceName)[1]','varchar(max)'); 
関連する問題