gpt4 book ai didi

azure - 我想提取在 MS Azure Synapse 中存储为 varchar(max) 的匹配标记的 XML 值

转载 作者:行者123 更新时间:2023-12-03 03:48:10 25 4
gpt4 key购买 nike

我是新的 Azure 之前使用 SAS 现在我们正在迁移到 azure synapse在当前环境下我想提取存储在 C 列 (varcharmax) 中的 XML 标记值作为变量。[数据集][1][1]:/image/tbSIF.png下面的XML保存在C列(PKDATA)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:DataSet xmlns:ns2="http://www.test.com/t/cn/el">
<EnumObject>
<name>Inpatient</name>
<value>262784067</value>
<radiobutton>false</radiobutton>
</EnumObject>
<StringObject>
<name>xxx</name>
<prompt></prompt>
<value>/widget.jsp</value>
<width>99</width>
</StringObject>
</ns2:DataSet>

如果姓名为住院患者,则住院类型为 262784067

输出

|一个 |乙|住院类型|| 11212 | 2587140 | 2587140 262784067 |

我使用了以下代码选择a,b,pkdata.value('/EnumObject/name') 作为住院类型来自 dbo.extdata

我收到以下错误找不到列“pkkddata”或用户定义函数或聚合“pkdata.value”,或者名称不明确。

我尝试使用以下查询,但出现错误 Msg 104220,Level 16,State 1,Line 26 Cannot find data type 'xml'。 SELECT a,b,(pkdata).value('(/EnumObject/name/text())[1]', 'varchar(100)') FROM [dbo].extdata 交叉应用 (SELECT CAST(pkdata AS xml) ) AS x(pkdata)

当我使用以下代码时,出现以下错误 XMLDT 方法“节点”只能在 xml 类型的列上调用。我尝试使用以下内容,但在传递 select x.* from [dbo].[EXTDATA] rt cross join xmltable( '/EnumObject/name' 传递 xmltype(rt.pkdata) columns name number path 'name/@ 附近时得到不正确的语法值') x

不知道如何继续

Azure SQL 版本Microsoft Azure SQL 数据仓库 - 10.0.16003.0 2021 年 4 月 28 日 04:55:16 版权所有 (c) Microsoft Corporation

最佳答案

Azure Synapse Analytics(特别是专用 SQL 池)不支持 XML 数据类型或其附带的任何函数,包括 FOR XML.nodes.value .query.modify

如果您需要这种类型的处理,可以使用传统的 SQL Server,例如 SQL Server 2019 或 Azure SQL DB。一种选择是使用 Synapse Pipelines 将数据移动到那里。作为替代方案,您可以考虑使用 Synapse Notebooks 和一些自定义 Python/Scala/c# 代码,但我只对此做了一个简单的测试。

Scala 中的简单示例:

单元格 1

// Get the table with the XML column from the database and expose as temp view
val df = spark.read.synapsesql("yourPool.dbo.someXMLTable")

df.createOrReplaceTempView("someXMLTable")

单元 2

%%sql
-- Use SparkSQL to interrogate the XML
-- https://spark.apache.org/docs/2.3.0/api/sql/index.html#xpath
SELECT
colA,
colB,
xpath_string(pkData,'/DataSet/EnumObject[name="Inpatient"]/value') xvalue
FROM someXMLTable

单元 3

val df2 = spark.sql(""" 
SELECT
colA,
colB,
xpath_string(pkData,'/DataSet/EnumObject[name="Inpatient"]/value') xvalue
FROM someXMLTable
""")

df2.show

细胞 4

// Write that dataframe back to the dedicated SQL pool
df2.write.synapsesql("yourPool.dbo.someXMLTable_processed", Constants.INTERNAL)

示例笔记本的屏幕截图: Synapse Notebook shredding XML

如今,XML 有点过时了 - 您是否考虑过切换到 JSON?此外,如果您的数据量不是那么大,那么仅使用 Azure SQL DB 而不是 Synapse 会便宜很多。

关于azure - 我想提取在 MS Azure Synapse 中存储为 varchar(max) 的匹配标记的 XML 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68163457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com