【问题标题】:Update several records in a table with a single SQL Server MERGE (from XML)使用单个 SQL Server MERGE(来自 XML)更新表中的多个记录
【发布时间】:2023-03-13 02:11:01
【问题描述】:

是否可以使用 SQL Server 2012 MERGE 从 XML 流更新表中的多个记录?

我的表如下:

我每天都会收到几次以下 XML 信封:

<WeatherForecastUpdate>
    <Location Temperature="67" Id="56">
        <Humidity>78%</Humidity>
        <Condition>Rain</Condition>
        <Wind>5mph</Wind>
    </Location>
    <Location Temperature="72" Id="783">
        <Humidity>51%</Humidity>
        <Condition>Clear</Condition>
        <Wind>5mph</Wind>   
    </Location>
</WeatherForecastUpdate>

我需要根据来自 XML 的 LocationID 更新天气数据。我知道如何MERGE 每条消息(位置),但我想知道是否有办法更新单个MERGE 中的所有表记录。

【问题讨论】:

  • 显示如果它是一条消息(位置)你是怎么做的......
  • 当您只想更新记录时,为什么要使用MERGE。使用UPDATE 语句来做到这一点

标签: sql-server xml xpath sql-server-2012 sql-merge


【解决方案1】:

是的,你可以!首先将xml转换为表格,然后MERGE:

DECLARE @x xml = N'<WeatherForecastUpdate>
    <Location Temperature="67" Id="56">
        <Humidity>78%</Humidity>
        <Condition>Rain</Condition>
        <Wind>5mph</Wind>
    </Location>
    <Location Temperature="72" Id="783">
        <Humidity>51%</Humidity>
        <Condition>Clear</Condition>
        <Wind>5mph</Wind>   
    </Location>
</WeatherForecastUpdate>'

;WITH cte AS (
    SELECT  t.v.value('@Temperature','int') Temperature,
            t.v.value('@Id','int') Id,
            t.v.value('(./Humidity)[1]','nvarchar(5)') Humidity,
            t.v.value('(./Condition)[1]','nvarchar(10)') Condition,
            t.v.value('(./Wind)[1]','nvarchar(10)') Wind
    FROM @x.nodes('/WeatherForecastUpdate/Location') as t(v)
)

MERGE YourTable as t
USING cte as s
ON t.LocationID = s.ID
WHEN MATCHED THEN
    UPDATE SET  Temp = s.Temperature,
                Humidity = s.Humidity,
                Wind = s.Wind

另一种使用简单 UPDATE 的方法:

UPDATE t
SET Temp = s.Temperature,
    Humidity = s.Humidity,
    Wind = s.Wind
FROM YourTable t
INNER JOIN cte s
    ON t.LocationID = s.ID

【讨论】:

  • UPDATE 是我们应该使用的。
  • 太棒了!非常感谢你。很多时候我一直在使用 MERGE 子句,但 UPDATE 更简洁,更合乎逻辑。
  • 实际上 - 在这种特殊情况下,无论使用什么:与更新合并,或者只是一个更新。两种解决方案都能满足您的需求。
猜你喜欢
  • 1970-01-01
  • 2018-03-11
  • 2014-11-08
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2011-06-03
  • 1970-01-01
相关资源
最近更新 更多