0

我正在连接到 Tcp 套接字并接收 xml 提要。例如,可以说 xml 如下所示。

  <?xml version="1.0" encoding="UTF-8"?>
       <games>
           <game id="1000" name="warthunder"  score="987610" rank="1" users_online="17625"/>
           <game id="1001" name="american pool"  score="187610" rank="2" users_online="1122"/>
       ......
      ......
        <game id="2000" name="our world"  score="7610" rank="2000" users_online="37"/>
 </games>

我每 2-3 秒收到一次,目前我将它存储在数据库中的 XML 列中。

因此,在我的前端,我从 sql 中将这一列作为 XML 读取并解析它。

我希望将所有 XML 属性存储为单独的列,这样就不需要解析 XML。但是每次收到 XML 时,我都需要进行 2000 次插入/更新。

有没有办法将 XML 切碎并插入到 SQL Server 中的单独列中?

谢谢你。

4

1 回答 1

1

.nodes()使用 XML 数据类型方法很容易实现。它允许粉碎 XML 并将其转换为矩形格式。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, game_id INT, [name] VARCHAR(30), score INT, [rank] INT, users_online INT);

DECLARE @xml XML = 
'<?xml version="1.0" encoding="UTF-8"?>
<games>
    <game id="1000" name="warthunder" score="987610" rank="1" users_online="17625"/>
    <game id="1001" name="american pool" score="187610" rank="2" users_online="1122"/>
    <game id="2000" name="our world" score="7610" rank="2000" users_online="37"/>
</games>';
-- DDL and sample data population, end

INSERT INTO @tbl (game_id,[name],score,[rank],users_online)
SELECT c.value('@id','INT') AS game_id
    , c.value('@name','VARCHAR(30)') AS [name]
    , c.value('@score','INT') AS score
    , c.value('@rank','INT') AS [rank]
    , c.value('@users_online','INT') AS users_online
FROM @xml.nodes('/games/game') AS t(c);

-- test
SELECT * FROM @tbl;

输出

+----+---------+---------------+--------+------+--------------+
| ID | game_id |     name      | score  | rank | users_online |
+----+---------+---------------+--------+------+--------------+
|  1 |    1000 | warthunder    | 987610 |    1 |        17625 |
|  2 |    1001 | american pool | 187610 |    2 |         1122 |
|  3 |    2000 | our world     |   7610 | 2000 |           37 |
+----+---------+---------------+--------+------+--------------+
于 2020-02-18T15:21:40.843 回答