按XML节点过滤SQL SELECT

时间:2013-07-09 11:42:34

标签: sql xml tsql

SQL表有xml - 类型字段:


| EntityId | EntityType  | Xml column                |
------------------------------------------------------
| 1        | Employee    | `<productId>1</productId>`|
------------------------------------------------------
| 1        | Product     | `<name>apple</name>`      |
------------------------------------------------------
| 7        | Shop        | `<country>...</country>`  |                      |   
-----------------------------------------------------|

我需要的是按Xml节点值过滤表格行:

SELECT * WHERE (EntityId='1' AND EntityType='Employee') 
OR ( EntityId=SomeFuncToGetXmlFieldByNodeName('productId') )

你可以指出我如何写SomeFuncToGetXmlFieldByNodeName(fieldName)

2 个答案:

答案 0 :(得分:1)

看起来你想要这样的功能。

CREATE FUNCTION [dbo].[SomeFuncToGetXmlFieldByNodeName]
(
    @NodeName nvarchar(100),
    @XML xml
)
RETURNS nvarchar(max)
AS
BEGIN
    RETURN @XML.value('(*[local-name(.) = sql:variable("@NodeName")]/text())[1]', 'nvarchar(max)')
END

它将节点名称和一些XML作为参数,并返回节点中的值。

使用这样的功能:

select T.EntityId,
       T.EntityType,
       T.[Xml column]
from YourTable as T
where T.EntityID = 1 and
      T.EntityType = 'Employee' or
      T.EntityId = dbo.SomeFuncToGetXmlFieldByNodeName('productId', T.[Xml column])

除了使用上面的内容之外,我还建议您尝试不使用标量值函数的查询。它改为使用exist() Method (xml Data Type)

select T.EntityId,
       T.EntityType,
       T.[Xml column]
from YourTable as T
where T.EntityID = 1 and
      T.EntityType = 'Employee' or
      T.[Xml column].exist('/productId[. = sql:column("T.EntityID")]') = 1

答案 1 :(得分:0)

我认为你正在寻找documentation

“查询”方法可能就是您所需要的。请参阅链接文章中的示例。