您可以直接在XQuery中将搜索条件应用于子节点:
declare @t table (XData xml);
declare @StatusValue varchar(50) = 'Pending',
@DepartmentId int = 23;
insert into @t (XData)
values (
N'<ArrayOfFlowDetailParameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<FlowDetailParameters>
<DepartmentId>23</DepartmentId>
<UserId />
<Username />
<FullName />
<ConfirmDateTime />
<Comment />
<Status>Pending</Status>
<AttachmentId />
</FlowDetailParameters>
<FlowDetailParameters>
<DepartmentId>22</DepartmentId>
<UserId />
<Username />
<FullName />
<ConfirmDateTime />
<Comment />
<Status>Pending</Status>
<AttachmentId />
</FlowDetailParameters>
<FlowDetailParameters>
<DepartmentId>7</DepartmentId>
<UserId />
<Username />
<FullName />
<ConfirmDateTime />
<Comment />
<Status>Pending</Status>
<AttachmentId />
</FlowDetailParameters>
<FlowDetailParameters>
<DepartmentId>18</DepartmentId>
<UserId />
<Username />
<FullName />
<ConfirmDateTime />
<Comment />
<Status>Pending</Status>
<AttachmentId />
</FlowDetailParameters>
</ArrayOfFlowDetailParameters>');
select a.c.query('.')
from @t t
cross apply t.XData.nodes('/ArrayOfFlowDetailParameters/FlowDetailParameters[
./DepartmentId[1]/text() = sql:variable("@DepartmentId")
and ./Status[1]/text() = sql:variable("@StatusValue")
]') a(c);
另外,由于您可能需要这样做,我还提供了一个如何参数化这样一个查询的示例。