0

在 SQL Server 2014 中,表的CustomColumns列包含具有以下结构的 XML 数据:

<CustomColumnsCollection>
  <CustomColumn>
    <Name>Brand</Name>
    <DataType>0</DataType>
    <Value>Duprim</Value>
  </CustomColumn>
  <CustomColumn>
    <Name>LabelGroup</Name>
    <DataType>0</DataType>
    <Value />
  </CustomColumn>
...
</CustomColumnsCollection>

我想获取ValueName等于的列的值,即“品牌”(以下代码是更大查询的一部分,我将其保存为VIEW):

MAX(DISTINCT PR.CustomColumns.value('(/CustomColumnsCollection/CustomColumn/Name="Brand"/Value)[0]', 'varchar(max)')) AS Brand

在这种情况下,我希望它返回“Duprim”。这是如何实现的?

4

2 回答 2

2

这是使用 XPath 谓词的另一种方法。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, CustomColumns XML);
INSERT INTO @tbl (CustomColumns)
VALUES
(N'<CustomColumnsCollection>
    <CustomColumn>
        <Name>Brand</Name>
        <DataType>0</DataType>
        <Value>Duprim</Value>
    </CustomColumn>
    <CustomColumn>
        <Name>LabelGroup</Name>
        <DataType>0</DataType>
        <Value/>
    </CustomColumn>
</CustomColumnsCollection>');
-- DDL and sample data population, end

DECLARE @param VARCHAR(30) = 'Brand';

SELECT  ID
    , c.value('(Value/text())[1]', 'VARCHAR(50)') AS [Value]
FROM @tbl
    CROSS APPLY CustomColumns.nodes('/CustomColumnsCollection/CustomColumn[(Name/text())[1] eq sql:variable("@param")]') AS t(c);

-- hard-coded value
SELECT  ID
    , c.value('(Value/text())[1]', 'VARCHAR(50)') AS [Value]
FROM @tbl
    CROSS APPLY CustomColumns.nodes('/CustomColumnsCollection/CustomColumn[(Name/text())[1] eq "Brand"]') AS t(c);

输出

+----+--------+
| ID | Value  |
+----+--------+
|  1 | Duprim |
+----+--------+

帮助您了解 MS Excel 使用的视图。如果您能提供一个最小的可重现示例,那就太好了:(1) DDL 和样本数据填充,即 CREATE 表加上 INSERT、T-SQL 语句。(2) 你需要做什么,即逻辑。(3) 基于上述#1 中的样本数据的期望输出。

用于 Excel 的 SQL

SELECT ID
    , CustomColumns.value('(/CustomColumnsCollection/CustomColumn[(Name/text())[1] eq "Brand"]/Value/text())[1]', 'VARCHAR(50)') AS [Value]
FROM @tbl;
于 2020-07-07T16:05:19.917 回答
0

尝试这样的事情:

SELECT
    xc.value('(Value)[1]', 'varchar(50)') 
FROM
    PR
CROSS APPLY
    PR.CustomColumns.nodes('/CustomColumnsCollection/CustomColumn') AS XT(XC)
WHERE   
    xc.value('(Name)[1]', 'varchar(50)') = 'Brand'

返回一个 XML 片段列表, .nodes()每个片段代表一个<CustomColumn>节点。选择子句中值为 的那个,并获取该NameXMLBrand节点的值WHEREValue

于 2020-07-07T14:33:28.013 回答