我正在努力产生一个输出,给我两个长的描述,即一个用德语,一个用英语。它可以是两个记录,一个长描述列和一个lang列,或者一个记录与长描述-de和长描述-en列。到目前为止,我已经找到了两种方法,不确定哪种方法更好,但我仍然无法用它们中的任何一种方法产生确切的输出:
-- 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)发布于 2021-09-13 15:13:38
请尝试以下解决方案。
要点:
使用NVARCHAR(MAX).
OPENXML()。它是为现已过时的Server 2000而设计的。.nodes()和.value()。从MS 2005开始,它们是可用的。,
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 |
+--------+---------------------+---------------------+https://stackoverflow.com/questions/69164755
复制相似问题