2011-12-05 11 views
4

XMLデータを含む列がありますが、XML型ではなくTEXT型です。 (私は別の理由でこれのようにそれを残さなければならない)。SQL Server 2005でのXMLノードの更新

基本的には、まずそれをNTextにキャストしてからXMLにキャストする必要があります。唯一の問題は、Node値を選択するために働く私の現在のフォーマットがそれを更新するために働かないことです。

エラーメッセージ:「AS」というキーワードの構文が正しくありません。

UPDATE tbl_Module_RequestForms_Items 
SET CAST(CAST(TicorOregon..tbl_Module_RequestForms_Items.XML AS NTEXT) AS XML).value('(//Record/Submitted)[1]', 'NVARCHAR(max)') = 'True' 
WHERE CAST(CAST(TicorOregon..tbl_Module_RequestForms_Items.XML AS NTEXT) AS XML).value('(//Record/Submitted)[1]', 'NVARCHAR(max)') <> 'True' 

XMLデータ:

<Record> 
    <Submitted>False</Submitted> 
</Record> 
+0

それは**されている場合は** XML - それ 'XML作ります'コラム - あなたはとても面倒なことや手間を省きます.... –

+0

とにかくその周りにあります。説明するのは難しいですが、この時点では、私は列の種類を変更することはできません。私は仕事を選択しましたが、この更新プログラムを動作させることはできません。ありがとう –

答えて

2

[n]varchar(max)でXMLを格納するための正当な理由があるかもしれません。 XMLだけを保存したい場合は、完全にOKですが、TSQLを使用してXMLの一部を変更する場合や、XMLに値を問い合わせる必要がある場合や、where句でノード/属性値を使用する必要がある場合は、データのインデックスを利用して型変換をスキップすることができます。 textは廃止予定ですので、少なくともデータ型を[n]varchar(max)

に変更することを検討してください。XML列にデータがある場合は、XML DMLを使用してXMLを変更してください。あなたの場合はreplace value ofのように使用します。

update tbl_Module_RequestForms_Items 
set XMLData.modify('replace value of (/Record/Submitted/text())[1] with "True"') 
where XMLData.value('(/Record/Submitted)[1]', 'bit') = 0 

不可能なXMLデータ型がないため、XML文書全体を抽出して修正してから、変更されたXML文書で表を更新する必要があります。

何らかの種類のクライアント開発ツールを使用してももちろん可能ですが、TSQLでも可能です。

  1. tbl_Module_RequestForms_Itemsのプライマリキーとデータ型XMLとしてテーブル変数を宣言します。
  2. 行をtbl_Module_RequestForms_Itemsから更新するテーブル変数にコピーします。
  3. replace value ofを使用してXMLを更新します。
  4. 変更をtbl_Module_RequestForms_Itemsに適用します。私はIDtbl_Module_RequestForms_Itemsの主キーであることと、XMLデータが列XMLDataであることを前提とし、このよう

何か:

declare @T table 
(
    ID int primary key, 
    XMLData xml 
) 

insert into @T 
select M.ID, 
     M.XMLData 
from tbl_Module_RequestForms_Items as M 
where cast(cast(XMLData as nvarchar(max)) as xml).value('(/Record/Submitted)[1]', 'bit') = 0 

update @T 
set XMLData.modify('replace value of (/Record/Submitted/text())[1] with "True"') 

update M 
set XMLData = cast(T.XMLData as nvarchar(max)) 
from tbl_Module_RequestForms_Items as M 
    inner join @T as T 
    on M.ID = T.ID 
+0

あなたは素晴らしいです!まさに私が必要なもの。ありがとう!!!! –

関連する問題