Sql server 2008 使用Xquery按XML类型字段筛选SQL查询返回的行
我有一个表,用于存储有关通过SSIS发生的错误的数据,包含信息的主列存储为XML。我希望能够在此列中查询名称/值对 要在SQL中进行解释,请从tmp中选择*,其中seq='7406834' 示例表:Sql server 2008 使用Xquery按XML类型字段筛选SQL查询返回的行,sql-server-2008,xquery,Sql Server 2008,Xquery,我有一个表,用于存储有关通过SSIS发生的错误的数据,包含信息的主列存储为XML。我希望能够在此列中查询名称/值对 要在SQL中进行解释,请从tmp中选择*,其中seq='7406834' 示例表: CREATE TABLE #tmp(id INT, category varchar(10), details xml) INSERT INTO #tmp(id,category,details) values (1,'cat1','<fields><field name
CREATE TABLE #tmp(id INT, category varchar(10), details xml)
INSERT INTO #tmp(id,category,details) values (1,'cat1','<fields><field name="brnum" value="586" /><field name="qty" value="0" /><field name="seq" value="7406815" /></fields>')
INSERT INTO #tmp(id,category,details) values (1,'cat2','<fields><field name="brnum" value="586" /><field name="qty" value="0" /><field name="seq" value="7406817" /></fields>')
INSERT INTO #tmp(id,category,details) values (1,'cat3','<fields><field name="brnum" value="586" /><field name="qty" value="0" /><field name="seq" value="7406834" /></fields>')
INSERT INTO #tmp(id,category,details) values (1,'cat4','<fields><field name="brnum" value="586" /><field name="qty" value="0" /><field name="seq" value="7406841" /></fields>')
DROP TABLE #tmp
谁能帮我学语法吗。我基本上可以使用一个派生表,将每个元素变成一列,然后查询该列,但似乎应该有一种更简单的方式,即为每行提供所有属性id、类别和详细信息,这些属性都有详细信息。seq='xxxxx'。改变了我的想法,使用了FLWOR:p
CREATE TABLE #tmp
(
id INT
, category VARCHAR(10)
, details XML
)
INSERT INTO #tmp
( id
, category
, details
)
VALUES ( 1
, 'cat1'
, '<fields><field name="brnum" value="586" /><field name="qty" value="0" /><field name="seq" value="7406815" /></fields>'
)
INSERT INTO #tmp
( id
, category
, details
)
VALUES ( 1
, 'cat2'
, '<fields><field name="brnum" value="586" /><field name="qty" value="0" /><field name="seq" value="7406817" /></fields>'
)
INSERT INTO #tmp
( id
, category
, details
)
VALUES ( 1
, 'cat3'
, '<fields><field name="brnum" value="586" /><field name="qty" value="0" /><field name="seq" value="7406834" /></fields>'
)
INSERT INTO #tmp
( id
, category
, details
)
VALUES ( 1
, 'cat4'
, '<fields><field name="brnum" value="586" /><field name="qty" value="0" /><field name="seq" value="7406841" /></fields>'
)
DECLARE @val INT = 7406834
SELECT *
FROM #tmp t
WHERE details.value('(for $f in //field
where data($f/@name) = "seq"
return
data($f/@value))[1]', 'int') = @val
DROP TABLE #tmp