单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)
答案 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!
“查询”方法可能就是您所需要的。请参阅链接文章中的示例。