0

したがって、次のノードのXML値をTrueに更新/挿入するスクリプトがあります。

<Submitted>False</Submitted>

問題は、すべての行にノードが含まれるわけではないため、「@temp'のMutator'modify()'をnull値で呼び出すことはできません」というエラーがスローされます。

XML内に「送信済み」ノードを含まない行を除外するにはどうすればよいですか?

**注:列タイプがTEXTであり、クライアントが最初にそのように設定したために変更できないため、これらのクレイジーなCASTSがすべてあります。

DECLARE @temp XML

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

-- modification to local XML var
SET 
   @temp.modify('replace value of (//Record/Submitted[1]/text())[1] with "True"') 

-- write it back into the table as TEXT column      
UPDATE 
   TicorOregon..tbl_Module_RequestForms_Items
SET 
   XML = CAST(CAST(@temp AS VARCHAR(MAX)) AS TEXT)
WHERE
 CAST(CAST(TicorOregon..tbl_Module_RequestForms_Items.XML AS NTEXT) AS XML).value('(//Record/Submitted)[1]', 'NVARCHAR(max)') <> 'True'
AND  CAST(CAST(TicorOregon..tbl_Module_RequestForms_Items.XML AS NTEXT) AS XML).value('(//Record/Submitted)[1]', 'NVARCHAR(max)') <> null
4

1 に答える 1

1

更新を試みる前に、XML変数のnullをテストしてください。

if @temp is not null
begin
  -- modification to local XML var
  SET @temp.modify ----

  -- write it back into the table as TEXT column
  SET @temp.modify....
end

注:が含まれる行が複数ある場合は、このコードで問題が発生する可能性があります<Submitted>False</Submitted>。1つの行からのXML @temp(おそらくいくつかのインデックスによると最後の行)がありますが、そのXMLですべての行を更新します。<Submitted>False</Submitted>

于 2011-12-07T07:15:17.237 に答える