如何在SQL Server中使XML.Node(....)路径动态而不是字符串文字

时间:2015-10-02 12:30:43

标签: sql-server xml tsql

我有一个查询,其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存储空间。

Table having XML entity in it

仅为示例XML结构添加两个。

下图中的XML结构在表updatedXML中   - entityIdPath是 Message / InfoList / Info / Id   - entityType为1

enter image description here

下图中的XML结构在表updatedXML中   - entityIdPath是 Message / Customers / Info / CustId   - entityType是2

enter image description here

两种XML结构都不同,同样有许多XML结构彼此不同。为了发现每个XML的标识,路径存储在entityIdPath中。

1 个答案:

答案 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

注意:

  1. UDF不能用作EXEC SP_不能在其中调用,这是由于SQL的限制。

  2. 带有CTE的递归TSQL可以是UDF的其他选项但是 提供更多的读取计数和CPU时间。