我有一个查询,其XML结构基于其实体类型而不同。 XML存储在SQL Server表中,附加列将具有有助于知道XML中的Identity元素[Id]的位置的路径。
/Message/InfoList/Info/Id
包含XML,updatedXML.entityIdPath
存储在updatedXML.entityIdPath
中。
如何在XML.nodes()
函数中使用select X.E.value('.','bigint') As EntityId
from updatedXML.xmlentity.nodes('/Message/InfoList/Info/Id') as X(E))
,以便单个查询使用xml.nodes拉出存储在表中的每个xml的entityid?
示例查询,在节点函数中将路径作为字符串文字。
{{1}}
表格中包含少量元数据的XML存储空间。
仅为示例XML结构添加两个。
下图中的XML结构在表updatedXML中 - entityIdPath是 Message / InfoList / Info / Id - entityType为1
下图中的XML结构在表updatedXML中 - entityIdPath是 Message / Customers / Info / CustId - entityType是2
两种XML结构都不同,同样有许多XML结构彼此不同。为了发现每个XML的标识,路径存储在entityIdPath中。
答案 0 :(得分:0)
以下是我为了让它发挥作用而创建的SP。
CREATE PROCEDURE [dbo].[QueryXMLWithPath]
@xml XML,
@xmlPath varchar(max)
AS
BEGIN
SET NOCOUNT ON;
declare @ParmDefinition nvarchar(505) = N'@d_xml XML';
declare @tsql nvarchar(max)= '
select X.E.value(''.'',''bigint'') As EntityId
from @d_xml.nodes('''+ @xmlPath +''') as X(E)
'
EXECUTE sp_executesql @tsql,@ParmDefinition, @d_xml = @xml
END
GO
以下是如何使用它的示例。
DECLARE @XMLEntityId TABLE
(
EntityId BIGINT
)
INSERT INTO @XMLEntityId(EntityId)
EXECUTE QueryXmlWithpath @MessageBody,@SubEntityIdPath
注意:
UDF不能用作EXEC SP_不能在其中调用,这是由于SQL的限制。
带有CTE的递归TSQL可以是UDF的其他选项但是 提供更多的读取计数和CPU时间。