从存储为XML的字符串创建lat和lon列

时间:2018-03-08 11:48:56

标签: xml tsql xquery

我已在<geoPos lat="24.569408d" lon="54.647884d"/> 数据类型字段

中以下列格式存储数据
CREATE TABLE table1(
    City CHAR(10),
    Sales INT NOT NULL,
    Sale_date DATE NOT NULL,
    First_order INT NOT NULL
);

INSERT INTO table1 VALUES
("Paris",2000,'2018-01-02',1),
("Munich",2000,'2018-02-17',1),
("Paris",2000,'2018-03-31',2),
("Paris",1000,'2017-01-01',2),
("Paris",1000,'2017-02-02',1),
("Paris",1000,'2017-03-02',1),
("Paris",10000,'2018-01-02',2),
("Munich",1000,'2017-01-01',1);

我想从上面的字符串中获取Lat和Lon值为2列。

1 个答案:

答案 0 :(得分:2)

转换为XML并使用Value方法。

这应该让你开始:

首先,创建并填充样本表(在将来的问题中保存此步骤):

DECLARE @T AS TABLE
(
    Col varchar(100)
)

INSERT INTO @T VALUES
('<geoPos lat="24.569408d" lon="54.647884d"/>'),
('<geoPos lat="20.573082d" lon="57.478468d"/>')

查询:

SELECT  Col, 
        CAST(Col As XML).value('(geoPos/@lat)[1]', 'varchar(10)') As Lat,
        CAST(Col As XML).value('(geoPos/@lon)[1]', 'varchar(10)') As lon
FROM @T

结果:

Col                                             Lat         lon
<geoPos lat="24.569408d" lon="54.647884d"/>     24.569408d  54.647884d
<geoPos lat="20.573082d" lon="57.478468d"/>     20.573082d  57.478468d

请注意我使用了varchar(10),因为这是您使用的值中的字符数。如果您有更长的值,则需要更长的varchar。

此外,如果要在数据库中存储纬度和经度,SQL Server(自2008年起)支持spatial geography数据类型。我个人对此数据类型没有任何经验,因此我不会尝试演示如何使用它。