sqlxml 相关问题

SQLXML是MS SQL(在SQL Server 2000中引入)中的一项功能,它支持XML查询和处理数据。

qbo3 从 TSQL 更新 XmlData

我有一个 qbo3 语句,我想在其中修改 ImportForm.XmlData 中的值。 例如,我在 XmlData 中有以下数据: 酒吧 我有一个 qbo3 语句,我想在其中修改 ImportForm.XmlData 中的值。 例如,我在XmlData中有以下数据: <ImportFormXml> <Foo>Bar</Foo> </ImportFormXml> 我希望能够: 修改Foo 添加一个节点NewField,并且 删除节点 OldField 这可以通过 TSQL 完成(在 qbo3 语句中)吗? 鉴于 ImportForm.XmlData: <ImportFormXml> <Foo>Bar</Foo> </ImportFormXml> 您可以使用 TSQL modify 子句,如下所示: DECLARE @ID int = 1 -- Add a new key/value pair UPDATE ImportForm SET XmlData.modify(' insert <NewField>NewValue</NewField> into (/ImportFormXml)[1] ') WHERE ImportFormID = @ID -- Update a key to a new value UPDATE ImportForm SET XmlData.modify('replace value of (/ImportFormXml/Foo/text())[1] with "Baz"') WHERE ImportFormID = 2 AND XmlData.exist('(/ImportFormXml/Foo)[1]') = 1; -- Delete an existing key UPDATE ImportForm SET XmlData.modify('delete /ImportFormXml/OldField') WHERE ImportFormID = @ID AND XmlData.exist('(/ImportFormXml/OldField)[1]') = 1; 请注意,使用此技术只能操作每个 UPDATE 子句的单个 Xml 节点字段。

回答 1 投票 0

SQL/XML 中的 XPath1,计数元素返回空

我使用的是 PostgreSQL 9,它采用 XPath-1 来实现 SQL/XML 标准合规性。 这个查询没问题,返回了预期的数据: 从 t 中选择 xpath('//img',xhtm) 但这另一张,数一下img

回答 2 投票 0

SQL 无循环更新多个 XML 节点值

我将以下简化的 XML 存储在 SQL 的 XML 列中: 我的第一所学校 我将以下简化的 XML 存储在 SQL 中的 XML 列中: <data> <SchoolName>My First School</SchoolName> <Table TableId="Classes"> <TableRow RowNumber="1"> <ClassName>Oak</ClassName> <TeacherName>Jane Smith</TeacherName> </TableRow> <TableRow RowNumber="2"> <ClassName>Oak</ClassName> <TeacherName>Fred Green</TeacherName> </TableRow> <TableRow RowNumber="3"> <ClassName>Oak</ClassName> <TeacherName>Mary Peters</TeacherName> </TableRow> </Table> <Table TableId="Pupils"> <TableRow RowNumber="1"> <PupilName>David</PupilName> </TableRow> <TableRow RowNumber="2"> <PupilName>Paul</PupilName> </TableRow> <TableRow RowNumber="3"> <PupilName>Sam</PupilName> </TableRow> </Table> </data> 我希望通过单个脚本将“Classes”XML 表中所有 TableRows 的“ClassName”值从“Oak”更新为“Maple”。 我写了下面的内容,它有效,但在大量行上非常耗时。 DECLARE @COUNT INT SET @COUNT = 3 --maximum number of rows WHILE @COUNT > 0 BEGIN PRINT CAST(@COUNT AS NVARCHAR(30)) UPDATE TableName SET XMLColumnName.modify('replace value of (/data/Table[@TableId=("Classes")]/TableRow[@RowNumber=sql:variable("@COUNT")]/ClassName/text())[1] with "Maple"') WHERE ... --move to the next table row SET @COUNT = @COUNT - 1 END 不幸的是,初始的 ClassValue 不一样,所以我无法查找和替换 Oak,除非可以选择使用通配符,例如%? 请问有更有效的方法吗? 您可以更有效地编写它,方法是循环直到没有任何内容可更新,并使用 WHERE exists 过滤器仅更新需要更新的行。 WHILE 1=1 BEGIN UPDATE TableName SET XMLColumnName.modify(' replace value of (data/Table [@TableId = "Classes"] /TableRow/ClassName/text()[. = "Oak"])[1] with "Maple" ') WHERE XMLColumnName.exist(' data/Table [@TableId = "Classes"] /TableRow/ClassName/text()[. = "Oak"] ') = 1; IF @@ROWCOUNT = 0 BREAK; END; db<>小提琴 或者您可以使用 XQuery 重建 XML,但是对于如此深层的嵌套结构,这会变得很复杂。 在每个级别上,检查是否有所需的节点。如果是,则创建一个替换节点(如果需要,可以下到另一个级别)。否则就退回你所拥有的。 UPDATE TableName SET XMLColumnName = XMLColumnName.query(' <data> { for $t in data/* return if ($t/@TableId = "Classes") then <Table> { for $r in $t/* return if ($r/ClassName/text()[. = "Oak"]) then <TableRow RowNumber = "{$r/@RowNumber}"> { for $n in $r/* return if (local-name($n) = "ClassName") then <ClassName>Maple</ClassName> else $n } </TableRow> else $r } </Table> else $t } </data> ') WHERE XMLColumnName.exist(' data/Table [@TableId = "Classes"] /TableRow/ClassName/text()[. = "Oak"] ') = 1; db<>小提琴

回答 1 投票 0

如何使用 XML 查询功能从 XML 节点查询值

我有以下 XML 数据: 声明@x XML 设置@x=' 订购 我有以下 XML 数据: DECLARE @x XML SET @x='<Orders> <HeadingSection> <DocumentNameCode>Order</DocumentNameCode> <DetailSection> <LineItem LineItemNumber="10"> <ItemId>123456789</ItemId> <ItemTypeId>EN</ItemTypeId> <AdditionalProductId Qualifier="ProductId"> <Item> <ItemId>ABC</ItemId> <TypeId>SA</TypeId> </Item> </AdditionalProductId> <AdditionalProductId Qualifier="ProductId"> <Item> <ItemId>XYZ</ItemId> <TypeId>IN</TypeId> </Item> </AdditionalProductId> </LineItem> </DetailSection> <SummarySection/> </HeadingSection> </Orders>' 我已经使用了以下T-Sql脚本(必须有光标) DECLARE @xmlQuittungPOS XML DECLARE quittungCurPOS CURSOR FOR SELECT QuittungXMLPOS = T.X.query('.') FROM @x.nodes('/Orders/HeadingSection/DetailSection/LineItem') AS T(X) OPEN quittungCurPOS FETCH NEXT FROM quittungCurPOS INTO @xmlQuittungPOS WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO dbo.tempPOS ( GTIN ,edi_PIA_SA ,edi_PIA_IN ) SELECT GTIN = T.X.query('/LineItem[ItemTypeId = "BP"]').value('(/LineItem/ItemId)[1]','VARCHAR(100)') -- funktioniert / works ,edi_PIA_SA = T.X.query('/LineItem/AdditionalProductId/Item[TypeId = "SA"]').value('(/LineItem/AdditionalProductId/Item/ItemId)[1]','VARCHAR(255)') -- funktioniert nicht / doesn't work ,edi_PIA_IN = T.X.query('/LineItem/AdditionalProductId/Item[TypeId = "IN"]').value('(/LineItem/AdditionalProductId/Item/ItemId)[1]','VARCHAR(255)') -- funktioniert nicht / doesn't work FROM @xmlQuittungPOS.nodes('/LineItem') AS T(X) FETCH NEXT FROM quittungCurPOS INTO @xmlQuittungPOS END CLOSE quittungCurPOS DEALLOCATE quittungCurPOS 1.) GTIN -> 查询有效 2.) PIA_SA 和 PIA_IN -> 查询不起作用 问题: 我认为这是因为 '/LineItem/AdditionalProductId/Item[TypeId = "SA"]' 位于附加节点中。 问题: 如何获取中TypeId“SA”和“IN”的值 <AdditionalProductId Qualifier="ProductId"> <Item> <ItemId>**ABC**</ItemId> <TypeId>SA</TypeId> </Item> </AdditionalProductId> <AdditionalProductId Qualifier="ProductId"> <Item> <ItemId>**XYZ**</ItemId> <TypeId>IN</TypeId> </Item> </AdditionalProductId> with .value('(/LineItem/AdditionalProductId/Item/ItemId)[1]','VARCHAR(255)') !处于 1 级! -- 我知道。 级别 1 上的 SA -> .value('(/LineItem/AdditionalProductId/Item/ItemId)[1]','VARCHAR(255)') 级别 2 上的 SA -> .value('(/LineItem/AdditionalProductId/Item/ItemId)[2]','VARCHAR(255)') 但我现在需要查询类型 谢谢 不清楚你在这里追求什么,所以我回答两者。如果您想要每个 Item 节点 1 行,那么您只需对 nodes 节点使用 Item 并获取 value 文本的 ItemId: DECLARE @xml xml = '<AdditionalProductId Qualifier="ProductId"> <Item> <ItemId>**ABC**</ItemId> <TypeId>SA</TypeId> </Item> </AdditionalProductId> <AdditionalProductId Qualifier="ProductId"> <Item> <ItemId>**XYZ**</ItemId> <TypeId>IN</TypeId> </Item> </AdditionalProductId> '; SELECT AP.I.value('(ItemId/text())[1]','varchar(15)') AS ItemId, AP.I.value('(TypeId/text())[1]','varchar(15)') AS TypeId FROM (VALUES(@XML))V(X) --To give impression it's against a table CROSS APPLY V.X.nodes ('AdditionalProductId/Item')AP(I); 但是,如果您希望每个不同的 TypeID 值各有 1 列,您可以在 XML 中进行过滤: SELECT X.AP.value('(AdditionalProductId/Item[TypeId[(text()[1])="SA"]]/ItemId/text())[1]','varchar(15)') AS ItemSA, X.AP.value('(AdditionalProductId/Item[TypeId[(text()[1])="IN"]]/ItemId/text())[1]','varchar(15)') AS ItemIN FROM @xml.nodes ('/')X(AP); --To give impression it's against a table 或者使用之前的查询并使用条件聚合: WITH Items AS( SELECT AP.I.value('(ItemId/text())[1]','varchar(15)') AS ItemId, AP.I.value('(TypeId/text())[1]','varchar(15)') AS TypeId FROM @xml.nodes ('AdditionalProductId/Item')AP(I)) SELECT MAX(CASE TypeID WHEN 'SA' THEN ItemId END) AS ItemSA, MAX(CASE TypeID WHEN 'IN' THEN ItemId END) AS ItemIN FROM Items;

回答 1 投票 0

从 SQL 问题生成 XML

我需要生成以下格式的XML: 当我遇到以下情况时,我没有对任务的 xml 部分走得太远,你可以看出这显然不是我的意图。 ...

回答 1 投票 0

如何在SQL Server中获取xml列的值

如何获取列的XML值? SELECT PaymentMethodDetail.value('(/ paymentMethodDetail/EFTPaymentDetails/AccountType/text())[0]','varchar(30)') as AccounType,* FROM paymentTable <

回答 1 投票 0

如何读取SqlServer中的xml列

我在 SqlServer 表中有一个 XML 列,我应该从 XML 中查询几个值。 我的 XML 列类似于下面的 @str 变量: 声明 @str nvarchar(2000) 设置@str = ' <

回答 1 投票 0

随着xml文档的增长,交叉应用xml查询的执行情况会成倍地恶化

我有什么 我有一个大小不一的XML文档,需要在MSSQL 2008 R2上进行解析,它看起来像这样。

回答 2 投票 13

SQL XML列 - 交叉应用以产生基于XML的多行1到多行。

我一直在研究这个帖子,但我还是不明白与XML数据的 "交叉应用"。也是这个帖子。我有一个Xml列,其中包含一个乘客,以及多个航班和航班-...

回答 1 投票 1

XML列--三级层次结构--具有交叉应用功能

我之前的问题在这里得到了解决。现在我又增加了一个复杂程度--数据是嵌套的父、子、孙的。你可以在这里看到并运行示例:https:/dbfiddle.uk?rdbms=......

回答 1 投票 0

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

我有一个xml值 1 John 5 James

回答 1 投票 0

如何在SQL Server中的XML编写更新表的别名2008年已经有一个“从”语句

在这里,我需要一个别名添加到“表名” AS T的更新已经从XML中获得价值一“从”语句。 UPDATE表名SET TableName.PrintedBy = ISNULL(TableName.PrintedBy,...

回答 1 投票 1

从表列中提取多个值之前强制转换为XML

我有一个包含下面的XML数据的表列作为为nvarchar(最大):

回答 1 投票 2

通过LoadXml()DXml对象加载xml文件时更改xml的编码

我在代码隐藏页面中有一些代码,它接收一个xml文件。由于名称中包含重音,我的页面出现错误,例如:José。我有什么方法可以改变或......

回答 1 投票 0

检索导入到SQL Server多个XML的特定字段

我有多个具有相同结构的XML文件,我使用以下命令将它们导入SQL Server 2017:DDL:CREATE DATABASE xmlFiles GO USE xmlFiles CREATE TABLE tblXMLFiles(...

回答 1 投票 1

jDeveloper ...无法部署jar工作(缺少库?)

显然是一个部署配置文件问题,但我打算通过一个窗口扔我的工作站。包括:import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet;进口......

回答 1 投票 0

不同导致查询不再按预期工作。我该如何解决这个问题?

我有一个节点的分层表,其中2个表'Attributes'和'Values'由耦合表链接。现在我正在尝试进行查询以返回特定树,为每个节点提供属性和...

回答 1 投票 1

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