0

有一个SQL带有xml-type 字段的表:


| 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)

4

2 回答 2

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])

我想建议您尝试不使用标量值函数的查询,而不是使用上面的方法。它使用了exists() 方法(xml 数据类型)

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
于 2013-07-09T13:49:02.540 回答
0

我认为您正在寻找文档

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

于 2013-07-09T11:56:29.763 回答