在单个查询中将VARCHAR(max)列转换为大写,然后转换为XML
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在单个查询中将VARCHAR(max)列转换为大写,然后转换为XML相关的知识,希望对你有一定的参考价值。
我尝试在StackOverflow中搜索没有成功。
我想在VARCHAR(max)
列上执行以下两次转换,但是在一个查询中。这是T-SQL。
- 使用
UPPER()
函数将列中的所有文本转换为大写 - 使用
XML
函数将列转换为CAST(column AS XML)
数据类型
我在下面尝试过,语法不正确。
SELECT CAST(UPPER(inputText) AS XML) AS ConvertedText
FROM SampleTable
SSMS返回错误。 (当我删除UPPER()时,查询运行没有错误。)
以“xml”开头的名称空间是保留的
XML严格区分大小写。使用字符串方法处理XML总是很危险的。因为XML不仅仅是一个带有一些花哨的附加功能的字符串......
您的XML是 - 我从发布的错误消息中获取此信息 - 包括xml声明。此外,我将谈论名称空间。 XML期望以小写形式表示命名空间的xml声明和声明。这不能是大写的。
看看这个:我定义了一个带有声明,默认命名空间和一个前缀命名空间的XML。
DECLARE @testXML NVARCHAR(MAX)=
N'<?xml version="1.0" encoding="UTF-16"?>
<root xmlns="dummy.default" xmlns:blah="Some.blah.namespace">
<test a="attribute value">element value</test>
<blah:NamespacedElement>value in a namespaced element</blah:NamespacedElement>
</root>';
SELECT UPPER(@testXML);
/*
<?XML VERSION="1" ENCODING="UTF-16"?>
<ROOT XMLNS="DUMMY.DEFAULT" XMLNS:BLAH="SOME.BLAH.NAMESPACE">
<TEST A="ATTRIBUTE VALUE">ELEMENT VALUE</TEST>
<BLAH:NAMESPACEDELEMENT>VALUE IN A NAMESPACED ELEMENT</BLAH:NAMESPACEDELEMENT>
</ROOT>
*/
- 声明被破坏,因为所有内部内容预计都是小写的。但这很容易。我们可以完全切断它。在SQL-Server中,这个声明没有任何意义。无论如何都会省略......
- 其次,我们必须处理xmlns
:
SELECT SUBSTRING(REPLACE(UPPER(@testXML),'xmlns','xmlns'),PATINDEX('%?>%',@testXML)+2,1000000);
/*
<ROOT xmlns="DUMMY.DEFAULT" xmlns:BLAH="SOME.BLAH.NAMESPACE">
<TEST A="ATTRIBUTE VALUE">ELEMENT VALUE</TEST>
<BLAH:NAMESPACEDELEMENT>VALUE IN A NAMESPACED ELEMENT</BLAH:NAMESPACEDELEMENT>
</ROOT>
*/
- 你可以看到,声明已经消失,xmlns
现在是小写的。这可以转换为XML:
SELECT CAST(SUBSTRING(REPLACE(UPPER(@testXML),'xmlns','xmlns'),PATINDEX('%?>%',@testXML)+2,1000000) AS XML)
但是 - 说实话 - 如果这不仅仅是一个奇怪的家庭作业,你永远不应该为整个事物(包括标记)改变XML的大小。
以上是关于在单个查询中将VARCHAR(max)列转换为大写,然后转换为XML的主要内容,如果未能解决你的问题,请参考以下文章
在 Azure Synapse 中将 .parquet 文件 varchar 列转换为日期时间
在 MySql 中将 VARCHAR 转换为 DECIMAL 值