您可以看到,我的XML Sql列中有此内容:
<LabelRequestInputParameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Count>100</Count>
<ConfirmedCountByMunicipality xsi:nil="true" />
<ConfirmedCountByProvincialGovernment xsi:nil="true" />
<ConfirmedCountBySymfaExpert xsi:nil="true" />
<TypeOfLabelDelivery>Post</TypeOfLabelDelivery>
<TypeOfLabel>Public</TypeOfLabel>
<NextState>Municipality</NextState>
</LabelRequestInputParameters>
我想选择count = 100的所有节点
declare @a nvarchar(max)
set @a='100'
select InputParameter.value(N'(/LabelRequestInputParameters/Count[@Count=(sql:variable("@a"))])[1]', 'Bigint') from Requests
但是当我运行此查询时,所有值都为null:
答案 0 :(得分:1)
假设您的XML结构相似并且只有元素中的值不同,您可以使用以下XQuery提取它:
DECLARE @a INT = 100
DECLARE @Tbl TABLE (XmlCol XML)
INSERT INTO @Tbl
VALUES (
'<LabelRequestInputParameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Count>100</Count>
<ConfirmedCountByMunicipality xsi:nil="true" />
<ConfirmedCountByProvincialGovernment xsi:nil="true" />
<ConfirmedCountBySymfaExpert xsi:nil="true" />
<TypeOfLabelDelivery>Post</TypeOfLabelDelivery>
<TypeOfLabel>Public</TypeOfLabel>
<NextState>Municipality</NextState>
</LabelRequestInputParameters>'
) ,
(
'<LabelRequestInputParameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Count>100</Count>
<ConfirmedCountByMunicipality xsi:nil="true" />
<ConfirmedCountByProvincialGovernment xsi:nil="true" />
<ConfirmedCountBySymfaExpert xsi:nil="true" />
<TypeOfLabelDelivery>Post</TypeOfLabelDelivery>
<TypeOfLabel>Public</TypeOfLabel>
<NextState>Municipality</NextState>
</LabelRequestInputParameters>'
),
(
'<LabelRequestInputParameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Count>150</Count>
<ConfirmedCountByMunicipality xsi:nil="true" />
<ConfirmedCountByProvincialGovernment xsi:nil="true" />
<ConfirmedCountBySymfaExpert xsi:nil="true" />
<TypeOfLabelDelivery>Post</TypeOfLabelDelivery>
<TypeOfLabel>Public</TypeOfLabel>
<NextState>Municipality</NextState>
</LabelRequestInputParameters>'
),
(
'<LabelRequestInputParameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Count>150</Count>
<ConfirmedCountByMunicipality xsi:nil="true" />
<ConfirmedCountByProvincialGovernment xsi:nil="true" />
<ConfirmedCountBySymfaExpert xsi:nil="true" />
<TypeOfLabelDelivery>Post</TypeOfLabelDelivery>
<TypeOfLabel>Public</TypeOfLabel>
<NextState>Municipality</NextState>
</LabelRequestInputParameters>'
)
SELECT q.Cnt
FROM @Tbl
CROSS APPLY XmlCol.nodes ('/LabelRequestInputParameters/Count') l(x)
CROSS APPLY
(
VALUES (l.x.value ('.','varchar(1000)'))
) Q(Cnt)
WHERE q.Cnt = @a
答案 1 :(得分:1)
如果我正确理解这一点,则表中有很多行,每一行都保留一个XML,每一行都具有给定的结构。因此<Count>
每行将只存在一次。是吗?
如果是这样,请尝试以下操作:
DECLARE @SomeTable TABLE(YourXML XML);
INSERT INTO @SomeTable VALUES
(N'<LabelRequestInputParameters>
<Count>100</Count>
<test>test 100</test>
</LabelRequestInputParameters>')
,(N'<LabelRequestInputParameters>
<Count>200</Count>
<test>test 200</test>
</LabelRequestInputParameters>');
SELECT *
FROM @SomeTable
WHERE YourXML.value('(/LabelRequestInputParameters/Count/text())[1]','int') = 100;
更新:您自己的代码中的一些单词
您的代码:
.value(N'(/LabelRequestInputParameters/Count[@Count=(sql:variable("@a"))])[1]', 'Bigint')
这将深入到<Count>
,并将过滤出现此名称的属性并将其与您引入的变量进行比较。如果有这样的事情,这可能会起作用
<Count Count="100">100</Count>
答案 2 :(得分:0)
SELECT InputParameter.value(N'(/LabelRequestInputParameters/Count)[1]','bigint')
FROM Requests
WHERE InputParameter.exist(N'/LabelRequestInputParameters/Count[.="100"]')=1
GO