2017-03-14 18 views
0

xmlデータを持つ表があります。何らかの理由で、xml値の一部のフィールドに矛盾するデータがあります。私はそれに応じてそれを変更する必要があります。下のテンプレートでは、フィールドtxtCapacityの値が範囲外の値であることがわかります。私は適切な形式に変換する必要がありますそれをフロートとして作る?xmlの値を適切な形式で変更してください。

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' 

答えて

0

私たちはフィールドtxtCapacityために見ることができますテンプレート以下では、あなたの文

を理解していない、値が範囲外の値がある

これはどうやって見ることができますか? の範囲外ですか?

これは通常の方法です。浮動小数点値はXML内に格納されます。これは、単に10への電力と科学的表記法である。この

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 

結果

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

を試してみてください。 3333.3333を返す...

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)') 

:あなたは、このような暗黙の型変換で簡単にこれを読むことができます。

あなたの例では、非常に危険な何かをやっている:あなたは、その順序位置(例えば'(/Form/L004/Field/node())[15]')でノードに対処しようとし。適切なノードを手に入れるには、適切なXQuery predicateを使用する必要があります。この完全に動作するテストシナリオチェック:

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 

を戻り値は4000であり、 - 12.345 - 変更後。

+0

ありがとうございました。 –

関連する問題