SQL replace einen Null-xml-Wert

Ich bin ein Anfänger in SQL, und ich weiß nicht, wie man eine Lösung für mein Problem findet.

Ich habe einen Tisch mit Items, eine Spalte enthält XML-Wert. Ich möchte überprüfen, ob ein Feld existiert und es aktualisiert

Ich finde einen path, um einen vorhandenen XML-Wert zu ändern, aber wenn es NULL ist, funktioniert es nicht

da ist mein code:

SELECT @xml=IDA_Xml, @isData = IDA_Xml.exist('(/Root/Data[1]/text())[1]') FROM DATA WHERE IDA_UId=@guid If (@xml is NULL) BEGIN -- Create a xml value with <Root></Root> -- It will be update later -- set isData to 0 END IF (@isData = 0) UPDATE ItemData SET IDA_Xml.modify (' insert <Data Name = "Info">{sql:variable("@number")}</Data> into (/Root/*)[1] ') WHERE IDA_UId = @guid; ELSE UPDATE ItemData SET IDA_Xml.modify (' replace value of (/Root/Data[1]/text())[1] with sql:variable("@number") ') WHERE IDA_UId = @guid; 

In diesem Fall ist der einfachste Ansatz in den meisten Fällen, das vorhandene Element wegzucasting und es als neu einzufügen:

 DECLARE @mockup TABLE(ID INT IDENTITY, Descr VARCHAR(100),YourXml XML); INSERT INTO @mockup VALUES ('element exists','<root><element>test</element><SomeOther>blah</SomeOther></root>') ,('element doesn''t exist','<root><SomeOther>blah</SomeOther></root>') ,('element exists, but empty','<root><element/><SomeOther>blah</SomeOther></root>'); --At the end, all should be `<element>new</element>` UPDATE @mockup SET YourXml.modify('delete (/root/element)[1]'); UPDATE @mockup SET YourXml.modify('insert <element>new</element> as first into (/root)[1]'); SELECT * FROM @mockup; 

Nach Ihrer Code-Struktur

 SELECT @xml=IDA_Xml, @isData = IDA_Xml.exist('(/Root/Data[1]/text())[1]') FROM DATA WHERE IDA_UId=@guid If (@xml is NULL) BEGIN UPDATE ItemData SET IDA_Xml = CAST('<root/>' as XML) WHERE IDA_UId = @guid; SET @isData = 0; END IF (@isData = 0) UPDATE ItemData SET IDA_Xml.modify (' insert <Data Name = "Info">{sql:variable("@number")}</Data> into (/Root/*)[1] ') WHERE IDA_UId = @guid; ELSE UPDATE ItemData SET IDA_Xml.modify (' replace value of (/Root/Data[1]/text())[1] with sql:variable("@number") ') WHERE IDA_UId = @guid; 

Aber ich würde es besser mit einem einzigen Update anstatt der ersten beiden Updates umstrukturieren

 SET IDA_Xml = CAST('construct your entire xml here' as XML)