4

XMLデータを含む列がありますが、テキストタイプであり、XMLタイプではありません。(別の理由でこのままにしておく必要があります)。

基本的に、最初にNTextにキャストし、次にXMLにキャストする必要があります。唯一の問題は、ノード値を選択するために機能する現在の形式が、それを更新するために機能しないことです。

エラーメッセージ:キーワード「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>
4

1 に答える 1

2

XMLをに格納する正当な理由があるかもしれません[n]varchar(max)。XMLのみを保存する場合はまったく問題ありませんが、TSQLを使用してXMLの一部を変更する場合、またはXMLに値を照会する必要がある場合、またはwhere句でノード/属性値を使用する必要がある場合は、XMLに切り替える必要があります。データのインデックスを利用して、型変換をスキップできます。は非推奨であるためtext、少なくともデータ型をに切り替えることを検討する必要があります[n]varchar(max)

XML列にデータがある場合は、XMLDMLを使用してXMLを変更します。あなたの場合、あなたはこのようなの置換値を使用するでしょう。

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主キーfromとXMLData列を使用して、データ型XMLとしてテーブル変数を宣言します。
  2. tbl_Module_RequestForms_Itemsからの行を、更新する必要のあるテーブル変数にコピーします。
  3. を使用してXMLを更新しますreplace value of
  4. 変更をに適用し直しtbl_Module_RequestForms_Itemsます。

IDこれがの主キーでtbl_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
于 2011-12-05T22:29:10.223 に答える