xquery-sql 相关问题

数据库系统支持的XQuery语言。包括要指定的系统标记(“sql-server”,“oracle”,“postgresql”等)。有关XQuery的一般问题,请单独使用“xquery”标记。

从多个 XML 列中提取值,每个列都有多个节点

我有一个表 (myTable),其中包含三个结构相同的 XML 字段: --字段1 123 456 --字段2 我有一个表 (myTable),其中包含三个结构相同的 XML 字段: --Field1 <div class="Class1"> <p>123</p> <p>456</p> </div> --Field2 <div class="Class2"> <p>abc</p> <p>def</p> </div> --Field3 <div class="Class3"> <p>XYZ</p> <p>AEIOU</p> </div> 我想提取 <p> 标签之间的值,我可以使用 nodes() 为单个字段完成此操作。但是,当我尝试引入其他字段时,它会创建所有值的交叉引用,而不是显示每个值的第一个、第二个等。 这是我的代码: SELECT a.b.value('.','nvarchar(max)') ,c.d.value('.','nvarchar(max)') ,e.f.value('.','nvarchar(max)') FROM myTable CROSS APPLY myTable.Field1.nodes('div/p') a(b) CROSS APPLY myTable.Field2.nodes('div/p') c(d) CROSS APPLY myTable.Field3.nodes('div/p') e(f) 产生如下输出: Field1 Field2 Field3 123 abc XYZ 123 abc AEIOU 123 def XYZ 123 def AEIOU 456 abc XYZ 456 abc AEIOU 456 def XYZ 456 def AEIOU 我希望输出为: Field1 Field2 Field3 123 abc XYZ 456 def AEIOU 有什么方法可以在单个查询中完成此任务吗? 编辑:请注意,它们将始终具有相同数量的节点。 提前致谢! 令人烦恼的是(据我所知),您无法从节点返回位置值,只能过滤到它(例如来自 Roger Wolf 的 answer 中演示的)。 相反,您可以为第一个 XML column 中的节点数创建一个 Tally,以便为每个 ID 的每个 p 节点获取一行。然后,您可以在调用 position() 方法时过滤 nodes,并为每个位置返回 1 行。 由于您已进入 2019 年,因此无法访问 GENERATE_SERIES,因此我使用 UDF 进行计数: --Create the UDF CREATE FUNCTION [fn].[Tally] (@LastNumber bigint, @Zero bit) RETURNS table AS RETURN WITH N AS( SELECT N FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)), Tally AS( SELECT 0 AS I WHERE @Zero = 0 AND @LastNumber IS NOT NULL UNION ALL SELECT TOP (ISNULL(@LastNumber,0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I FROM N N1, N N2, N N3, N N4, N N5, N N6, N N7) --Up to 10,000,000 rows SELECT I FROM Tally T; GO --Create sample data CREATE TABLE dbo.YourTable (YourID int IDENTITY, XML1 xml, XML2 xml, XML3 xml); INSERT INTO dbo.YourTable VALUES('<div class="Class1"> <p>123</p> <p>456</p> </div>','<div class="Class2"> <p>abc</p> <p>def</p> </div>','<div class="Class3"> <p>XYZ</p> <p>AEIOU</p> </div>'); GO --The actual solution WITH NodeCounts AS( SELECT YT.YourID, COUNT(*) AS Nodes FROM dbo.YourTable YT CROSS APPLY YT.XML1.nodes('/div/p') div(p) GROUP BY YT.YourID) SELECT YT.YourID, X1.p.value('(./text())[1]','varchar(30)') AS Field1, X2.p.value('(./text())[1]','varchar(30)') AS Field2, X3.p.value('(./text())[1]','varchar(30)') AS Field3 FROM dbo.YourTable YT JOIN NodeCounts NC ON YT.YourID = NC.YourID CROSS APPLY fn.Tally(NC.Nodes,1) T CROSS APPLY YT.XML1.nodes('/div/p[position() = sql:column("T.I")]') X1(p) CROSS APPLY YT.XML2.nodes('/div/p[position() = sql:column("T.I")]') X2(p) CROSS APPLY YT.XML3.nodes('/div/p[position() = sql:column("T.I")]') X3(p); db<>小提琴

回答 1 投票 0

如何执行与 OPENXML 相同的操作,但使用 SQL Server 中的nodes() 方法

在 SQL Server 中,除了使用 Nodes() 方法之外,与此 OPENXML 命令等效的命令是什么? 声明 @MyXML XML = '名称 AT1 在 SQL Server 中,除了使用 Nodes() 方法之外,与此 OPENXML 命令等效的命令是什么? DECLARE @MyXML XML = '<data><Row><Name>Name A</Name><Type>T1</Type></Row><Row><Name>Name B</Name><Type>T2</Type></Row></Data>' DECLARE @ID INT EXEC SP_XML_PREPAREDOCUMENT @ID OUTPUT, @MyXML SELECT [Value] AS 'Value',     [Type] AS 'Type' INTO #temp1 FROM OPENXML (@ID, '/Data/Row', 2) WITH ( [Value] NVARCHAR(100)     [Type] NVARCHAR(100) ) 这是我所能得到的: SELECT aaa.value('.', 'NVARCHAR(100)') AS 'Value' INTO #temp1 FROM @MyXML.nodes('/Data/Row') AS T(aaa) 我不知道如何填充[类型]字段。 #temp1 基本上应该有 2 行,其中包含“名称”和“类型”列。每行将是: Name A | T1 Name B | T2 不确定为什么您认为 . 会从 Name 节点获取结果,这只会为您提供整个外部 Row 节点。您需要 (Name/text())[1] 来代替。并为 Type 节点选择另一列。 SELECT x1.datarow.value('(Name/text())[1]', 'NVARCHAR(100)') AS Value, x1.datarow.value('(Type/text())[1]', 'NVARCHAR(100)') AS Type FROM @MyXML.nodes('/Data/Row') AS x1(datarow); db<>小提琴

回答 1 投票 0

在 xml.modify 方法中使用子字符串和可能的替代方案

有谁知道如何批量更新 SQL Server 数据库中的列吗? 情况如下:我有一个列 Config 定义为 nvarchar(max),但它包含格式...

回答 1 投票 0

SQL - 将字符串的一部分与列值匹配

用户输入以下字符串2SMD4COMPUTEREH2KLD【自由输入】 我需要的是在表 devices 中找到正确的 id 用户输入以下字符串 2SMD4COMPUTEREH2KLD [

回答 2 投票 0

XQuery:使用 if 语句时删除 xml 声明

考虑以下三个陈述。 1: XMLSERIALIZE(文档 XMLQUERY(q'^ 复制 $i := $doc 修改 ( 对于 $i/tdfmt/text() 中的 $j...

回答 1 投票 0

XQuery 在属性中拉取数据

我有这个疑问 ;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/DMF/2007/08'AS DMF) 选择 Res.Expr.value('(../DMF:ResultDetail/Operator/Attribute/@ResultValue)[1...

回答 1 投票 0

如何在 SQL Server 中读取 XML

<Result xmlns="uri:SomeNamespace"> <PD:Summary xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"> <p1:p xmlns:p1="http://www.w3.org/1999/xhtml"> Our top-of-the-line competition mountain bike. Performance- enhancing options include the innovative HL Frame, super-smooth front suspension, and traction for all terrain.</p1:p> </PD:Summary> </Result> 如何在 SQL Server 中使用 XQuery 读取此 XML 的元素和属性? 假设您的 XML 数据位于 SQL 变量中 - 您可以尝试这样的操作 尊重所有定义的 XML 命名空间 深入 XML 代码: DECLARE @XmlData XML = '<Result xmlns="uri:SomeNamespace"> <PD:Summary xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"> <p1:p xmlns:p1="http://www.w3.org/1999/xhtml"> Our top-of-the-line competition mountain bike. Performance- enhancing options include the innovative HL Frame, super-smooth front suspension, and traction for all terrain.</p1:p> </PD:Summary> </Result>'; -- setup the XML namespaces in play WITH XMLNAMESPACES('uri:SomeNamespace' AS ns1, 'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd, 'http://www.w3.org/1999/xhtml' AS p1) -- select the /Result/Summary/p element respecting all the involved namespaces SELECT BodyText = @XmlData.value('(/ns1:Result/pd:Summary/p1:p/text())[1]', 'varchar(2000)') 你会得到类似的结果: BodyText ------------------------------------------------------------------------ Our top-of-the-line competition mountain bike. Performance- enhancing options include the innovative HL Frame, super-smooth front suspension, and traction for all terrain.

回答 1 投票 0

替换SQL Server XML中多处出现的节点值

我尝试使用下面的代码将 XML 中多个位置存在的 user_input_attn_obligee_desc 的值替换为值 EDWIN CHAND。 开始 声明 @d1 XML = ' 我尝试使用下面的代码将 XML 中多个位置存在的 user_input_attn_obligee_desc 的值替换为值 EDWIN CHAND。 BEGIN DECLARE @d1 XML = ' <root> <first> <var name="user_input_attn_obligee_desc">OBLIGEE ATTORNEY</var> </first> <second> <var name="user_input_attn_obligee_desc">saravanan</var> </second> <user_input_attn_obligor_desc>OBLIGOR ATTORNEY</user_input_attn_obligor_desc> </root> '; DECLARE @d NVARCHAR(MAX) = 'EDWIN CHAND'; DECLARE @element_name NVARCHAR(MAX) = 'user_input_attn_obligee_desc'; DECLARE @counter INT = 1; DECLARE @nodeCount INT = @d1.value('count(/root//*[(@name=sql:variable("@element_name"))])', 'INT'); WHILE @counter <= @nodeCount BEGIN SET @d1.modify('replace value of (/root//*[(@name=sql:variable("@element_name"))])[sql:variable("@counter")] with sql:variable("@d")'); SET @counter = @counter + 1; END; SELECT @d1; END 但我收到此错误: XQuery [modify()]: 替换的目标最多为一个节点,找到 'element(*,xdt:untyped) *' 我必须在代码中更改什么才能解决此问题? 请尝试以下解决方案。 SQL DECLARE @d1 XML = ' <root> <first> <var name="user_input_attn_obligee_desc">OBLIGEE ATTORNEY</var> </first> <second> <var name="user_input_attn_obligee_desc">saravanan</var> </second> <user_input_attn_obligor_desc>OBLIGOR ATTORNEY</user_input_attn_obligor_desc> </root>'; DECLARE @d NVARCHAR(MAX) = 'EDWIN CHAND'; DECLARE @element_name NVARCHAR(MAX) = 'user_input_attn_obligee_desc'; DECLARE @counter INT = 1; DECLARE @nodeCount INT = @d1.value('count(/root/*/var[@name=sql:variable("@element_name")][text()!=sql:variable("@d")])', 'INT'); WHILE @counter <= @nodeCount BEGIN SET @d1.modify('replace value of (/root/*/var[@name=sql:variable("@element_name")][text()!=sql:variable("@d")]/text())[1] with sql:variable("@d")'); SET @counter += 1; END; SELECT @d1; 输出 <root> <first> <var name="user_input_attn_obligee_desc">EDWIN CHAND</var> </first> <second> <var name="user_input_attn_obligee_desc">EDWIN CHAND</var> </second> <user_input_attn_obligor_desc>OBLIGOR ATTORNEY</user_input_attn_obligor_desc> </root>

回答 1 投票 0

解析数据透视的 xml

我有以下xml数据 &l...

回答 1 投票 0

XML数据转SQL表,获取子节点数据困难

我有一个要加载到 SQL 中的 xml 文件。我可以毫无问题地加载 xml 文件并将顶级节点放入 sql 表中。我很难到达下一级子节点。 ...

回答 1 投票 0

使用 T-SQL Xquery 从 XML 中提取数据,其中低 ASCII 表示为“”?或者只使用 T-SQL?

我在 XML 中有包含低位 ASCII 的字符串。具体来说,EDI 包含特殊字符,如 char(28)、char(29)、char(30)(也称为文件分隔符/组分隔符/记录分隔符)。 T...

回答 3 投票 0

XQuery - 列出每个大陆上人口最多的国家的名称和人口。

我必须做下面的练习,但我不知道怎么做。列出各大洲人口最多的国家的名称和人口。禁止使用5大洲的ID,在...

回答 1 投票 0

查询在SQL Server中删除XML中的一个标签。

我有一个xml,名称空间如下。我如何删除标签 使用XML查询从XML中删除标签。我们可以删除的标签,像下面的查询。我不知道如何通过...

回答 1 投票 0

如何使用xQuery在SQL Server中根据XML文件属性将值插入表中?

我想始终将XML的第一个属性插入同一张表中,但是根据最后一个XML属性的值,我必须将其插入到另一个表中。我想到的是类似...

回答 1 投票 0

带有空XML节点的SQL XPath比较变量

我有以下代码:声明@mydoc xml声明@myPhone nvarchar(12)='2223334445'声明@lastName nvarchar(100)='约翰'声明@myEmail nvarchar(100)=空集@mydoc =' ...

回答 1 投票 0

以递增顺序在多个节点上插入属性

我在SQL Server表中有一个XML列。我想向XML中存在的节点添加一个属性。该属性将是节点的唯一标识符。我写了一些代码,例如:DECLARE ...

回答 1 投票 1

如何使用xquery搜索具有多个相同类型节点的SQL XML列?

我在SQL中有一列保存XML数据。我想搜索它,但是目前没有得到想要的结果。 XML具有以下格式: [[[[] ]

回答 1 投票 1

在SQL Server的嵌套XML中传递参数

我有一个如下所示的xml文件。具有主分支Teacherdetails的xml查询可以是单个对象或多个对象。内部教师详细信息学生人数用b表示,学生列表为...

回答 1 投票 0

BaseX XQuery命令获取XML文件名

我在BaseX数据库中有多个XML文件:是否有XQuery或BaseX函数来获取文件名?在上面的示例中,我想要另一个将DB03.xml作为输出返回的查询。

回答 1 投票 0

将XML列数据分解为SQL中的行

我有一个xml值 1 John 5 James

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.