Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQLServer中使XML.Node(..)路径动态,而不是字符串文本_Sql Server_Xml_Tsql - Fatal编程技术网

Sql server 如何在SQLServer中使XML.Node(..)路径动态,而不是字符串文本

Sql server 如何在SQLServer中使XML.Node(..)路径动态,而不是字符串文本,sql-server,xml,tsql,Sql Server,Xml,Tsql,我有一个查询,它的XML结构根据其实体类型而不同。 XML存储在SQL Server表中,其他列将具有路径,这将有助于了解标识元素[Id]在XML中的位置 updatedXML.xmlentity具有XML,并且/Message/InfoList/Info/Id存储在updatedXML.entityIdPath中 如何在XML.nodes()函数中使用updatedXML.entityIdPath,以便单个查询提取包含XML.nodes的表中存储的每个XML的entityid 示例查询,路径作

我有一个查询,它的XML结构根据其实体类型而不同。 XML存储在SQL Server表中,其他列将具有路径,这将有助于了解标识元素[Id]在XML中的位置

updatedXML.xmlentity
具有XML,并且
/Message/InfoList/Info/Id
存储在
updatedXML.entityIdPath

如何在
XML.nodes()
函数中使用
updatedXML.entityIdPath
,以便单个查询提取包含XML.nodes的表中存储的每个XML的entityid

示例查询,路径作为节点函数中的字符串文本

select X.E.value('.','bigint') As EntityId 
from updatedXML.xmlentity.nodes('/Message/InfoList/Info/Id') as X(E))
具有XML存储且元数据很少的表作为单个列

仅为示例XML结构添加两个

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

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


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

下面是我为使其工作而创建的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
注:

  • 由于SQL的限制,无法在中调用EXEC SP,因此无法使用UDF

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


  • 下面是我为使其工作而创建的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
    
    注:

  • 由于SQL的限制,无法在中调用EXEC SP,因此无法使用UDF

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


  • 在此发布表结构entityid和XML列,其中dataQuestion更新了潜在的表结构和存储在其中的XML数据的结构。似乎SQL中除了文本字符串路径之外没有其他方法。我开始使用带有sp_executesql和用户定义的tabel类型的动态sql来管理它,因为现在没有人,一种方法是循环并将sql变量传递给XML并获取值,但每次都会有一个值,所以我不想使用另一种方法,可能是外部应用,让我们来研究一下,如果我成功,我将在这里发布:)只在这里发布你的预期输出alsosql:variable可用于查找本地节点名称,但当需要更深入时,这是没有帮助的。如果我理解的话,那么您的意思是使用sql:variable循环每个节点,这是一种递归查询,使用CTE?post here表结构entityid和XML列,其中的dataQuestion更新为潜在的表结构和存储在其中的XML数据结构。似乎sql中除了文本字符串路径之外没有其他方法。我开始使用带有sp_executesql和用户定义的tabel类型的动态sql来管理它,因为现在没有人,一种方法是循环并将sql变量传递给XML并获取值,但每次都会有一个值,所以我不想使用另一种方法,可能是外部应用,让我们来研究一下,如果我成功,我将在这里发布:)只在这里发布你的预期输出alsosql:variable可用于查找本地节点名称,但当需要更深入时,这是没有帮助的。如果我理解的话,那么您的意思是使用sql:variable循环每个节点,这是一种使用CTE的递归查询?