首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xml.modify中的SQL替换函数“替换值”

Xml.modify中的SQL替换函数“替换值”
EN

Stack Overflow用户
提问于 2017-11-01 05:18:22
回答 2查看 3.3K关注 0票数 3

我正在尝试更新Server中的一些XML数据。XML包含的数据如下所示:

代码语言:javascript
复制
<root>
    <id>1</id>
    <timestamp>16-10-2017 19:24:55</timestamp>
</root>

假设该XML存在于名为Data的列中,该列位于名为TestTable的表中。我希望能够将时间戳中的连字符更改为正斜杠。

我希望我能做这样的事情:

代码语言:javascript
复制
update TestTable
set Data.modify('replace value of 
(/root/timestamp/text())[1] with REPLACE((/root/timestamp/text())[1], "-", "/")')

我得到以下错误:

XQuery TestTable:没有函数‘{http://www.w3.org/2004/07/xpath-functions}:替换()’

当我想到它的时候,这是有道理的。但我想知道,有没有办法在一个更新声明中做到这一点?还是首先需要查询时间戳值并将其保存为变量,然后使用变量更新XML?

EN

回答 2

Stack Overflow用户

发布于 2018-08-08 07:31:40

您还可以通过内联视图的联接来完成这一任务,并使用SQL替换函数:

代码语言:javascript
复制
   CREATE TABLE TestTable
   (    
       Id INT IDENTITY(1,1) NOT NULL,
       Data XML NOT NULL
   )

   INSERT TestTable (Data) VALUES ('<root>
        <id>1</id>
        <timestamp>16-10-2017 19:24:55</timestamp>
    </root>')

    UPDATE TestTable
    SET Data.modify('replace value of 
    (/root/timestamp/text())[1] with sql:column("T2.NewData")')
    FROM TestTable T1
    INNER JOIN (
        SELECT Id
        , REPLACE( Data.value('(/root/timestamp/text())[1]', 'nvarchar(max)'), '-', '/') AS NewData
        FROM TestTable
    ) T2
    ON T1.Id = T2.Id

    SELECT * FROM TestTable
票数 3
EN

Stack Overflow用户

发布于 2017-11-01 10:25:33

如果没有外部需要,您必须完全填充,则应该在ISO8601中使用ISO8601日期/时间字符串。

您的dateTime-string与区域性相关。在具有不同语言或日期格式设置的不同系统上阅读此操作将导致错误或--甚至更糟!!--导致错误结果。

像"08-10-2017“这样的日子可以是10月8日或8月10日.

最糟糕的一点是,这可能成功地通过了所有的测试,但是会在客户的机器上出现奇怪的错误消息或糟糕的结果,最终导致真正的数据破坏!

将连字符转换为斜线只是化妆品而已!XML是严格定义的数据容器。任何非字符串数据都必须表示为安全的可转换字符串。

这就是你应该做的:

代码语言:javascript
复制
DECLARE @tbl TABLE(ID INT IDENTITY,YourXML XML);
INSERT INTO @tbl VALUES
(N'<root>
    <id>1</id>
    <timestamp>16-10-2017 19:24:55</timestamp>
</root>');

UPDATE @tbl SET YourXml.modify(N'replace value of (/root/timestamp/text())[1] 
                                 with concat(  substring((/root/timestamp/text())[1],7,4), "-"
                                              ,substring((/root/timestamp/text())[1],4,2), "-"
                                              ,substring((/root/timestamp/text())[1],1,2), "T"
                                              ,substring((/root/timestamp/text())[1],12,8)
                                            ) cast as xs:dateTime?');

SELECT * FROM @tbl;

结果

代码语言:javascript
复制
<root>
  <id>1</id>
  <timestamp>2017-10-16T19:24:55</timestamp>
</root>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47048658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档