使用单个 SQL 服务器 MERGE(来自 XML)更新 table 中的多个记录
Update several records in a table with a single SQL Server MERGE (from XML)
是否可以使用 SQL Server 2012 MERGE
从 XML 流更新 table 中的多条记录?
我的table如下:
我每天都会收到几次 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
.
中更新所有 table 记录
是的,你可以!首先将xml转换为table,然后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 t
SET Temp = s.Temperature,
Humidity = s.Humidity,
Wind = s.Wind
FROM YourTable t
INNER JOIN cte s
ON t.LocationID = s.ID
是否可以使用 SQL Server 2012 MERGE
从 XML 流更新 table 中的多条记录?
我的table如下:
我每天都会收到几次 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
.
是的,你可以!首先将xml转换为table,然后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 t
SET Temp = s.Temperature,
Humidity = s.Humidity,
Wind = s.Wind
FROM YourTable t
INNER JOIN cte s
ON t.LocationID = s.ID