Xml 和 MS SQL Server 2019,插入
Xml and MS SQL Server 2019, insert
我正在连接到 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 Insert/Updates
有没有办法粉碎 XML 并插入 SQL 服务器中的单独列?
谢谢。
使用XML数据类型.nodes()
方法很容易实现。它允许切碎 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;
Output
+----+---------+---------------+--------+------+--------------+
| 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 |
+----+---------+---------------+--------+------+--------------+
我正在连接到 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 Insert/Updates有没有办法粉碎 XML 并插入 SQL 服务器中的单独列?
谢谢。
使用XML数据类型.nodes()
方法很容易实现。它允许切碎 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;
Output
+----+---------+---------------+--------+------+--------------+
| 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 |
+----+---------+---------------+--------+------+--------------+