2017-03-14 6 views
0

Ich habe eine Tabelle mit XML-Daten. Aus irgendeinem Grund haben bestimmte Felder im XML-Wert inkonsistente Daten. Ich muss es entsprechend modifizieren. In der unteren Vorlage können wir für das Feld txtCapacity sehen, dass der Wert außerhalb des Bereichs liegt. Ich muss es in das richtige Format umwandeln es als Float zu machen?Ändern Sie den Wert in Xml mit dem richtigen Format

Below is the table structure 

Table XML_Capacity 
(RID int, 
xml_detail xml 
) 

Xml template 

    <Form> 
<LT004> 
<Field> 
    <id>txtDate</id> 
    <value>3/14/2017</value> 
    <tag /> 
    <visible>true</visible> 
    <description>Install Date:</description> 
    <comment /> 
</Field> 
<Field> 
    <id>txtAge</id> 
    <value /> 
    <tag /> 
    <visible>true</visible> 
    <description>Age:</description> 
    <comment /> 
</Field> 
<Field> 
    <id>txtCapacity</id> 
    **<value>4.000000000000000e+003</value>** 
    <tag /> 
    <visible>true</visible> 
    <description> Capacity:</description> 
    <comment /> 
</Field> 
<Field> 
    <id>Status</id> 
    <value>Upgrade Repair Not Marked</value> 
    <tag /> 
    <visible>true</visible> 
    <description>Status</description> 
    <comment /> 
</Field> 
<Field> 
    <id>RemovedDate</id> 
    <value /> 
    <tag /> 
    <visible>false</visible> 
    <description>Date:</description> 
    <comment /> 
</Field> 

I used the below code to modify but it is not allowing me to use convert 
    function inside that update statement 

UPDATE XML_Capacity 
SET xml_detail.modify('replace value of (/Form/L004/Field/text())[16] with (/FormValue/L004/Field/text())[16]') 
Where 
xml_detail.value('(/Form/L004/Field/node())[15]', 'varchar(45)') = 'txtCapacity' 

Antwort

0

Ich verstehe nicht, Ihre Aussage

In unter Vorlage wir für das Feld txtCapacity sehen können, hat sich der Wert außerhalb des zulässigen Bereichs Wert

Wie können wir das sehen? Was ist außerhalb des Bereichs?

Dies ist der normale Weg, ein Float-Wert wird in XML gespeichert. Versuchen Sie, dieses

SELECT CAST(10.0/3 AS FLOAT(5)) AS SimpleFloat 
     ,CAST(10.0/3 AS FLOAT(53)) AS MaxFloat 
     ,CAST(10000.0/3 AS FLOAT(5)) AS SimpleFloatBig 
     ,CAST(10000.0/3 AS FLOAT(53)) AS MaxFloatBig 
FOR XML RAW,ELEMENTS 

Das Ergebnis

<row> 
    <SimpleFloat>3.3333330e+000</SimpleFloat> 
    <MaxFloat>3.333333000000000e+000</MaxFloat> 
    <SimpleFloatBig>3.3333333e+003</SimpleFloatBig> 
    <MaxFloatBig>3.333333333000000e+003</MaxFloatBig> 
</row> 

Das ist einfach die wissenschaftliche Notation mit einer Leistung bis zehn. Sie können dies leicht mit implizite Konvertierung wie folgt lesen:

DECLARE @xml XML= 
'<row> 
    <SimpleFloat>3.3333330e+000</SimpleFloat> 
    <MaxFloat>3.333333000000000e+000</MaxFloat> 
    <SimpleFloatBig>3.3333333e+003</SimpleFloatBig> 
    <MaxFloatBig>3.333333333000000e+003</MaxFloatBig> 
</row>'; 
SELECT @xml.value(N'(/row/SimpleFloatBig/text())[1]',N'float(53)') 

... die 3333.3333 zurückgibt.

In Ihrem Beispiel Sie tun etwas sehr gefährlich: Sie versuchen, den Knoten mit seiner Stellung (z '(/Form/L004/Field/node())[15]') zu adressieren. Sie sollten lieber den richtigen XQuery predicate verwenden, um die Hände auf den richtigen Knoten zu bekommen. Sehen Sie sich diese voll funktionsfähige Testszenario:

CREATE DATABASE TestDB; 
GO 
USE TestDB; 
CREATE TABLE XML_Capacity 
(RID int, 
xml_detail xml 
); 

INSERT INTO XML_Capacity(RID,xml_detail) 
VALUES(1, 
N'<Form> 
    <LT004> 
    <Field> 
     <id>txtDate</id> 
     <value>3/14/2017</value> 
     <tag /> 
     <visible>true</visible> 
     <description>Install Date:</description> 
     <comment /> 
    </Field> 
    <Field> 
     <id>txtAge</id> 
     <value /> 
     <tag /> 
     <visible>true</visible> 
     <description>Age:</description> 
     <comment /> 
    </Field> 
    <Field> 
     <id>txtCapacity</id> 
     <value>4.000000000000000e+003</value> 
     <tag /> 
     <visible>true</visible> 
     <description> Capacity:</description> 
     <comment /> 
    </Field> 
    <Field> 
     <id>Status</id> 
     <value>Upgrade Repair Not Marked</value> 
     <tag /> 
     <visible>true</visible> 
     <description>Status</description> 
     <comment /> 
    </Field> 
    <Field> 
     <id>RemovedDate</id> 
     <value /> 
     <tag /> 
     <visible>false</visible> 
     <description>Date:</description> 
     <comment /> 
    </Field> 
    </LT004> 
</Form>'); 

SELECT xml_detail.value(N'(/Form/LT004/Field[(id/text())[1]="txtCapacity"]/value/text())[1]',N'float') 
FROM XML_Capacity; 
GO 

DECLARE @NewValue FLOAT=12.345; 
UPDATE XML_Capacity 
SET xml_detail.modify(N'replace value of (/Form/LT004/Field[(id/text())[1]="txtCapacity"]/value/text())[1] with sql:variable("@NewValue")') 
WHERE RID=1; 


SELECT xml_detail.value(N'(/Form/LT004/Field[(id/text())[1]="txtCapacity"]/value/text())[1]',N'float') 
FROM XML_Capacity; 

USE master; 
GO 
DROP DATABASE TestDB; 
GO 

Die Rückgabewerte sind 4000 und - nach der Änderung - 12.345.

+0

Danke, es hat gut funktioniert. –

Verwandte Themen