xml - 在 SSMS 中读取 XML
问题描述
我正在尝试生成一个输出,它会给我两个长描述,即一个用德语和一个用英语。它可以是两条记录,1 个 [long-description] 列和一个 [lang] 列,或者 1 个记录,同时具有 [long-description-de] 和 [long-description-en] 列。到目前为止,我已经找到了 2 种方法,不确定哪种方法更好,但我仍然无法使用其中任何一种方法产生准确的输出:
-- XML
DECLARE @idoc INT, @doc NVARCHAR(max);
SET @doc ='
<enfinity>
<offer sku="123456">
<sku>123456</sku>
<long-description xml:lang="de-DE">German</long-description>
<long-description xml:lang="en-US">English</long-description>
</offer>
</enfinity>
';
-- Method 1
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;
SELECT *
FROM OPENXML (@idoc, '/enfinity/offer/long-description')
WITH( sku int '../sku',
[long-description] nvarchar(max) '../long-description',
lang nvarchar(max) '../@lang');
-- Method 2
DECLARE @T XML
SET @T = @doc
SELECT Y.ID.value('@sku', 'nvarchar(max)') as [sku],
Y.ID.value('@long-description', 'nvarchar(max)') as [long-description-de],
Y.ID.value('@long-description', 'nvarchar(max)') as [long-description-en]
FROM @T.nodes('/enfinity/offer') as Y(ID)
解决方案
请尝试以下解决方案。
要点:
- 最好使用 XML 数据类型而不是
NVARCHAR(MAX)
. - 最好不要使用 Microsoft 专有
OPENXML()
的 . 它是为现已过时的 SQL Server 2000 制作的。 - 最好使用 XQuery 方法
.nodes()
和.value()
. 它们从 MS SQL Server 2005 开始可用。 - 区分 XML 元素与属性很重要。这就是为什么你的两次尝试都没有成功的原因。
SQL
DECLARE @doc XML =
N'<enfinity>
<offer sku="123456">
<sku>123456</sku>
<long-description xml:lang="de-DE">German</long-description>
<long-description xml:lang="en-US">English</long-description>
</offer>
</enfinity>';
SELECT c.value('@sku', 'nvarchar(max)') as [sku]
, c.value('(long-description[@xml:lang="de-DE"]/text())[1]', 'nvarchar(max)') as [long-description-de]
, c.value('(long-description[@xml:lang="en-US"]/text())[1]', 'nvarchar(max)') as [long-description-en]
FROM @doc.nodes('/enfinity/offer') as t(c);
输出
+--------+---------------------+---------------------+
| sku | long-description-de | long-description-en |
+--------+---------------------+---------------------+
| 123456 | German | English |
+--------+---------------------+---------------------+
推荐阅读
- amazon-s3 - 使用Snowflake自带的原生stage相比有S3作为stage area有什么缺点
- linux - Unison 失败:未捕获的异常失败(“input_value:格式错误的消息”)
- php - 未定义索引:第30行/storage/ssd1/900/12273900/public_html/upload_image.php中的 faceId
- r - R - 将 Dataframe 子集到所有可能的组合中
- facebook - 在 Spark AR Studio 中使用本机 UI 选择器在双语过滤器中切换语言
- xslt - XSLT 1.0 - 在 sum 之前格式化数字
- c# - 如何在 Identity 3.1 中自定义用户?
- arangodb - arango shell 不包含在 ArangoDB 3.6.3 for macos 中
- ruby-on-rails - 在不触摸/保存标记记录的情况下修改作为可标记的标记
- neo4j - 如何使用 Neo4j 变量,不使用变量/标识符的查询行为不同