Sql server 如何在SQLServer中使XML.Node(..)路径动态,而不是字符串文本
我有一个查询,它的XML结构根据其实体类型而不同。 XML存储在SQL Server表中,其他列将具有路径,这将有助于了解标识元素[Id]在XML中的位置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 示例查询,路径作
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
注:
下面是我为使其工作而创建的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
注:
在此发布表结构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的递归查询?