2

我正在尝试查询 XML 列以返回属性位于可能值列表中的所有行。

XQuery 允许类似

SELECT COUNT(*) 
FROM table
WHERE xml_col.exist('//Field.[@name=("value1","value2","value3")]') = 1

这将返回具有属性@name 设置为“value1”、“value2”或“value3”的字段的记录数。

我想做的是编写一个简洁的查询,可以将集合“value1”、“value2”、“value3”作为输入参数处理,例如

DECLARE @list NVARCHAR(100)

SET @list = '("value1","value2","value3")'

SELECT COUNT(*) 
FROM table
WHERE xml_col.exist('//Field.[@name=sql:variable("@list")]') = 1

这当然是无效的。任何建议,将不胜感激!

4

3 回答 3

3

最简单的方法是(如果你的名字不能包含,):

declare @list nvarchar(max) = ',value1,value2,value3,'

select count(*) 
from test
where xml_col.exist('//Field[contains(sql:variable("@list"), concat(",", @name, ","))]') = 1;

或 SQL 方式:

select count(*) 
from test
where
    exists
    (
         select 1 from xml_col.nodes('//Field') as T(C)
         where T.C.value('@name', 'nvarchar(max)') in ('value1', 'value2', 'value3')
    )

sql fiddle demo

于 2013-08-17T13:32:38.573 回答
1

也许在这种情况下,在 SQL 端检查会更容易:

SELECT COUNT(*) 
FROM table
WHERE xml_col.value('(//Field/@name)[1]', 'nvarchar(255)') in ('value1', 'value2', 'value3')

如果您的 XML 中只有一个元素,至少这会起作用Field,否则它会变得更复杂一些。

于 2013-08-16T21:18:20.910 回答
1

您可以尝试以下构造:

select count(1)
from [table] t
where exists (
    select 1 from (values ('value1'),('value2'),('value3')) l(v)
    where t.xml_col.exist('//Field[@name=sql:column("l.v")]') = 1);

它也可以通过以下方式与表变量或表值参数一起使用:

declare @list table (value varchar(100))
insert into @list values ('value1'),('value2'),('value3')

或者

create type ListOfValues as table (value varchar(100))
GO
declare @list ListOfValues
insert into @list values ('value1'),('value2'),('value3')

接着

select count(1)
from [table] t
where exists(select 1 from @list l
    where t.xml_col.exist('//Field[@name=sql:column("l.value")]') = 1);
于 2013-08-18T00:37:33.860 回答