在SQL Server中,xml数据保存在文本列中,如何从此列进行查询?

时间:2010-10-14 07:34:26

标签: xml tsql

在我的情况下,xml数据保存在文本列中,如何针对此列进行查询?例如:

create table t1
(
    id INT IDENTITY(1, 1) PRIMARY KEY,
    content text
)


insert into t1(content) values ('<?xml version="1.0"?>
<people>
    <person>
        <firstName>ooo</firstName>
        <lastName>ppp</lastName>
    </person>
</people>
')
insert into t1(content) values ('<?xml version="1.0"?>
<people>
    <person>
        <firstName>mmm</firstName>
        <lastName>nnn</lastName>
    </person>
    <person>
        <firstName>aaa</firstName>
        <lastName>bbb</lastName>
    </person>
</people>
')
insert into t1(content) values ('<?xml version="1.0"?>
<people>
    <person>
        <firstName>aaa</firstName>
        <lastName>bbb</lastName>
    </person>
</people>
')

如何获取所有拥有某个人的行,其名字 aaa 且姓氏为 bbb


编辑:

我稍微更改了insert语句,以便您可以直接将其强制转换为 XML 类型。

注意:

内容列的类型为文字,因为它是一个代表我实际问题的示例。我正在做一个遗留项目。

第二行和第三行的名字是 aaa ,姓氏是 bbb ,我只需要这些行。

4 个答案:

答案 0 :(得分:4)

以下内容应该:

SELECT
 *
FROM
(
    SELECT 
        CAST([content] AS XML) AS xmlcontent 
    FROM 
        t1
) det
WHERE 
xmlcontent.exist('//person[firstName[text()="aaa"] and lastName[text()="bbb"]]') = 1

我还将此条目添加到您的设置中:

insert into t1(content) values ('<?xml version="1.0"?>
<people>
    <person>
        <firstName>ooo</firstName>
        <lastName>ppp</lastName>
    </person>
    <person>
        <firstName>aaa</firstName>
        <lastName>ppp</lastName>
    </person>
    <person>
        <firstName>ooo</firstName>
        <lastName>bbb</lastName>
    </person>
</people>
')

表示如果同时匹配名字的人和匹配姓氏的其他人,则不会将其视为匹配。

答案 1 :(得分:0)

试试这个:

SELECT * FROM t1
WHERE content.value('(//firstName)[1]', 'varchar(MAX)') = 'aaa'

答案 2 :(得分:0)

窃取Dusty的答案,然后以下工作,如果你在插入语句中删除了开头引号和xml声明之间的新行:

SELECT * FROM t1
WHERE CONVERT(xml,content).value('(//firstName)[1]', 'varchar(8000)') = 'aaa'

答案 3 :(得分:0)

这是一个使用变量搜索内容的解决方案,因此您不必连接现有查询。

DECLARE @t1 table (
    id INT IDENTITY(1, 1) PRIMARY KEY,
    content xml
);
insert into @t1(content) values ('<?xml version="1.0"?>
<people>
    <person>
        <firstName>ooo</firstName>
        <lastName>ppp</lastName>
    </person>
</people>');
insert INTO @t1(content) values ('<?xml version="1.0"?>
<people>
    <person>
        <firstName>mmm</firstName>
        <lastName>nnn</lastName>
    </person>
    <person>
        <firstName>aaa</firstName>
        <lastName>bbb</lastName>
    </person>
</people>');
insert into @t1(content) values ('<?xml version="1.0"?>
<people>
    <person>
        <firstName>aaa</firstName>
        <lastName>bbb</lastName>
    </person>
</people>');

DECLARE @firstName nvarchar(50);
DECLARE @lastName nvarchar(50);
SELECT @firstName = 'aaa', @lastName = 'bbb';
SELECT * FROM @t1 t WHERE t.[content].[exist]('//person[firstName=sql:variable("@firstName") and lastName=sql:variable("@lastName")]')=1;