简体   繁体   English

在SQL Server中将单位追加到XML列值

[英]Append unit to a XML column value in SQL Server

I have a table with a XML column for storing the file details. 我有一个带有XML列的表,用于存储文件详细信息。 Now I want to update the size node in the XML column with KB or MB according to the value. 现在,我想根据值用KB或MB更新XML列中的大小节点。

Sample data: 样本数据:

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

Expected result: 预期结果:

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

Sample data: 样本数据:

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

Expected result: 预期结果:

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

You can use an updateable CTE 您可以使用可更新的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;

First I read the value of the "Size" field. 首先,我读取“大小”字段的值。 If it is divideable by 1024 it will be written as "MB", otherwise the value remains as "KB". 如果可以将其除以1024,它将被写入“ MB”,否则该值将保持为“ KB”。

The final UPDATE will update the CTE, but this affects the tables column actually. 最终的UPDATE将更新CTE,但这实际上会影响表列。 The SELECT shows the modified table data. SELECT显示修改后的表数据。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM