1

SQL Server 2012MERGEを使用して、XML ストリームからテーブル内の複数のレコードを更新することはできますか?

私のテーブルは次のとおりです。

ここに画像の説明を入力

1 日に数回、次の 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>

LocationIDXMLに基づいて気象データを更新する必要があります。個々のメッセージ (場所) の方法は知っていますがMERGE、単一の .xml 内のすべてのテーブル レコードを更新する方法があるかどうか疑問に思いますMERGE

4

1 に答える 1

2

はい、できます!最初に 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
于 2016-09-03T03:49:21.570 に答える