我需要有关通过变量将XML路径传递给nodes()方法的帮助。我看了几篇不同的文章,发现可以使用local- name
和传递节点sql:variable
。下面的示例按预期工作:
DECLARE @XML_Path VARCHAR(MAX)
, @XML_In XML
SET @XML_Path = 'GetData'
SET @XML_In =
'
<GetData>
<test>234</test>
</GetData>
'
--THIS WORKS
SELECT Item_Idx = Nodes.value('(test)[1]' ,'INT')
FROM @XML_In.nodes('/*[local-name()=sql:variable("@XML_Path")]') Results(Nodes)
但是,当我尝试传递路径而不是单个节点时,它不起作用:
SET @XML_Path = 'GetData/Hello'
SET @XML_In =
'
<GetData>
<Hello>
<test>234</test>
</Hello>
</GetData>
'
--THIS DOES NOT WORK
SELECT Item_Idx = Nodes.value('(test)[1]' ,'INT')
FROM @XML_In.nodes('/*[local-name()=sql:variable("@XML_Path")]') Results(Nodes)
我需要能够在始终为常数的路径的另一部分之前传递路径。因此,在我的示例中,“测试”部分将始终相同,但其上方的路径将有所不同。
我怀疑这local-name
不是这样做的方法。但是,有其他方法可以做到这一点吗?
任何帮助,将不胜感激。
我曾考虑过使用动态SQL,但是此代码将在返回结果表的UDF中使用。
编辑:
我相信我不清楚自己要做什么。我需要能够将不同的XML路径传递到使用它们来切碎XML的函数中。
例子1
DECLARE @XML_In XML
SELECT @XML_In =
'
<RootNode1>
<ExtraNode1>
<Items>
<ExampleItem>
<SomeNode>100</SomeNode>
<Attributes>
<ID>1</ID>
<Name>a</Name>
<Value>123a</Value>
</Attributes>
</ExampleItem>
<ExampleItem>
<SomeNode>200</SomeNode>
<Attributes>
<ID>2</ID>
<Name>b</Name>
<Value>234</Value>
</Attributes>
</ExampleItem>
<ExampleItem>
<SomeNode>300</SomeNode>
<Attributes>
<ID>3</ID>
<Name>c</Name>
<Value>345</Value>
</Attributes>
</ExampleItem>
</Items>
</ExtraNode1>
</RootNode1>
'
SELECT SomeNode = Nodes.value('(../SomeNode)[1]' ,'INT')
, ID = Nodes.value('(ID)[1]' ,'INT')
, Name = Nodes.value('(Name)[1]' ,'VARCHAR(100)')
, Value = Nodes.value('(Value)[1]' ,'NVARCHAR(MAX)')
FROM @XML_In.nodes('/RootNode1/ExtraNode1/Items/ExampleItem/Attributes') Results(Nodes)
例子2
DECLARE @XML_In XML
SELECT @XML_In =
'
<Example2Root>
<Entries>
<Entry>
<SomeNode>100</SomeNode>
<Fields>
<ID>1</ID>
<Name>a</Name>
<Value>123a</Value>
</Fields>
</Entry>
<Entry>
<SomeNode>200</SomeNode>
<Fields>
<ID>2</ID>
<Name>b</Name>
<Value>234</Value>
</Fields>
</Entry>
<Entry>
<SomeNode>300</SomeNode>
<Fields>
<ID>3</ID>
<Name>c</Name>
<Value>345</Value>
</Fields>
</Entry>
</Entries>
</Example2Root>
'
SELECT SomeNode = Nodes.value('(../SomeNode)[1]' ,'INT')
, ID = Nodes.value('(ID)[1]' ,'INT')
, Name = Nodes.value('(Name)[1]' ,'VARCHAR(100)')
, Value = Nodes.value('(Value)[1]' ,'NVARCHAR(MAX)')
FROM @XML_In.nodes('/Example2Root/Entries/Entry/Fields') Results(Nodes)
我希望能够将路径传递给函数,以便它可以执行此操作并将其作为表返回:
SELECT SomeNode = Nodes.value('(../SomeNode)[1]' ,'INT')
, ID = Nodes.value('(ID)[1]' ,'INT')
, Name = Nodes.value('(Name)[1]' ,'VARCHAR(100)')
, Value = Nodes.value('(Value)[1]' ,'NVARCHAR(MAX)')
FROM @XML_In.nodes('SOME_PATH') Results(Nodes)
但是我不知道如何使用参数作为路径。大多数情况下,路径会有所不同。
您不想更改整个功能,而只需更改XQuery中的路径。如您所知,这是不可能的。
但是:您似乎在不同的结构中找到相同的数据。至少你似乎知道,你会发现一个名为节点ID
,Name
以及Value
节点下面SomeNode
…
因此,这种方法可能以完全不同的方式解决了您的问题…至少在您给出的两个示例中,它都可以起作用…
SELECT p.*
FROM
(
SELECT Nd.value('.','int') AS SomeNode
,Deeper.value('local-name(.)','nvarchar(max)') AS NodeName
,Deeper.value('.','nvarchar(max)') AS NodeValue
FROM @XML_In.nodes('//SomeNode') AS Sm(Nd)
OUTER APPLY Nd.nodes('parent::*/*[local-name(.)!="SomeNode"]/*') AS TwoLevels(Deeper)
) AS tbl
PIVOT
(
MIN(NodeValue) FOR NodeName IN(ID,Name,Value)
) AS p
在此解决方案中,您的第一个工作示例显示了如何SomeNode
用作变量…
问题内容: 在SQL Server中,我可以从应用程序中复制sql代码,然后将其粘贴到SSMS中,声明并分配sql中存在的var,然后运行。是伟大的调试方案。 例如(请注意,我生疏了,语法可能不正确): 我想在pgAdmin中使用Postgres做类似的事情(或其他postgres工具,有什么建议吗?),我可以将我的SQL(参数和全部)放到可以在Postgres DB上运行的东西上。 我意识到您可
问题内容: 在维基节点mysql的,我注意到变量(样)插入SQL查询两种不同的方式,一种是通过在查询字符串中间插入一个变量,另一种方式是通过将在查询字符串,并在下一个参数的数组中定义这些值。查询中替换的值将被转义。 有什么区别?什么时候应该在另一个上使用?(如果我们希望表名是一个变量,是否应该将其转义?) 维基密码 Wiki链接 :https : //github.com/felixge/node
问题内容: 他们是否有理由不决定在Android中添加contains方法(用于Path)? 我想知道我在路径中的点,并希望它比在这里看到的容易: 如何判断封闭路径是否包含给定点? 对我来说,创建一个ArrayList并将整数添加到数组中会更好吗?(我在控制声明中只检查了一次)。 到目前为止,我的选择是: 使用区域 使用ArrayList 扩展课堂 你的建议 我只是在寻找最有效的方法 问题答案:
我有以下(很大= 我有一个文件,它定义了我要提取的字段及其路径: 因此,HotelName的路径是:。 现在我想了解每家酒店的信息。我无法为它们创建类(如这里),因为脚本必须是动态的,并且将传递具有不同定义文件的不同XML文件。 我如何通过使用路径来解决这个问题,没有类,内存使用率低(= //编辑:一切都已实现。我只需要一种方法来遍历酒店,并使用我拥有的路径获取它们的值。
问题内容: 我想要求/包括一个文件,并将其内容检索到一个变量中。 test.php index.php 喜欢但是比它仍然应该执行PHP代码。这可能吗? 问题答案: 我也遇到过这个问题,尝试类似
问题内容: 如何在SQL Server中解析包含URL路径值的列? 输入 应该返回: 每行的路径值不同 问题答案: 如果您拥有已知的或最大数量的级别,则可以使用一些XML。 如果未知,则必须动态进行。 例子 退货