2017-02-28 13 views
1

ファイルの詳細を格納するためのXML列を持つテーブルがあります。今私は値に応じてKBまたはMBでXML列のサイズノードを更新したいと思います。SQL ServerのXML列値に単位を追加します。

サンプルデータ:

<FileInfo> 
    <Field Name="Filename">PV_1_PV_4126_C-482N-25457-005_V1.pdf</Field> 
    <Field Name="Created">02/21/2017</Field> 
    <Field Name="Modified">02/21/2017</Field> 
    <Field Name="Uploaded By">2120</Field> 
    <Field Name="Uploaded On">02/21/2017</Field> 
    <Field Name="Size">755</Field> 
</FileInfo> 

期待される結果:

<FileInfo> 
    <Field Name="Filename">PV_1_PV_4126_C-482N-25457-005_V1.pdf</Field> 
    <Field Name="Created">02/21/2017</Field> 
    <Field Name="Modified">02/21/2017</Field> 
    <Field Name="Uploaded By">2120</Field> 
    <Field Name="Uploaded On">02/21/2017</Field> 
    <Field Name="Size">755 KB</Field> 
</FileInfo> 

サンプルデータ:

<FileInfo> 
    <Field Name="Filename">PV_1_PV_4126_C-482N-25457-005_V1.pdf</Field> 
    <Field Name="Created">02/21/2017</Field> 
    <Field Name="Modified">02/21/2017</Field> 
    <Field Name="Uploaded By">2120</Field> 
    <Field Name="Uploaded On">02/21/2017</Field> 
    <Field Name="Size">1024</Field> 
</FileInfo> 

期待される結果:

<FileInfo> 
    <Field Name="Filename">PV_1_PV_4126_C-482N-25457-005_V1.pdf</Field> 
    <Field Name="Created">02/21/2017</Field> 
    <Field Name="Modified">02/21/2017</Field> 
    <Field Name="Uploaded By">2120</Field> 
    <Field Name="Uploaded On">02/21/2017</Field> 
    <Field Name="Size">1 MB</Field> 
</FileInfo> 

答えて

2

あなたが更新可能CTE

DECLARE @dummy TABLE(YourXMLColumn XML); 
INSERT INTO @dummy VALUES 
(
    N'<FileInfo> 
     <!--More fields--> 
     <Field Name="Size">755</Field> 
    </FileInfo> ' 
) 
,(
    N'<FileInfo> 
     <!--More fields--> 
     <Field Name="Size">1024</Field> 
    </FileInfo> ' 
); 

WITH ReplaceValue AS 
(
    SELECT YourXMLColumn 
      ,ca2.newSize 
    FROM @dummy AS d 
    CROSS APPLY(SELECT d.YourXMLColumn.value(N'(/FileInfo/Field[@Name="Size"]/text())[1]',N'int')) AS ca1(size) 
    CROSS APPLY(SELECT CASE WHEN ca1.size % 1024=0 
          THEN CAST(ca1.size/1024 AS VARCHAR(10)) + ' MB' 
          ELSE CAST(ca1.size AS VARCHAR(10)) + ' KB' END) AS ca2(newSize) 
) 
UPDATE ReplaceValue SET YourXMLColumn.modify(N'replace value of (/FileInfo/Field[@Name="Size"]/text())[1] with sql:column("newSize")'); 

SELECT * FROM @dummy; 

ファーストを使用することができます私は、「サイズ」フィールドの値を読み取ります。 1024で割り切れる場合は "MB"と書かれ、それ以外の場合は "KB"のままです。

最後のUPDATEはCTEを更新しますが、実際にはテーブルの列に影響します。 SELECTに変更されたテーブルデータが表示されます。

関連する問題