Sql server 如果其他列值等于某个值,SQL Server将解析XML列以获取列值

Sql server 如果其他列值等于某个值,SQL Server将解析XML列以获取列值,sql-server,xml,tsql,xquery,shred,Sql Server,Xml,Tsql,Xquery,Shred,在SQL Server 2014中,包含CustomColumns列的表,该列包含具有以下结构的XML数据: <CustomColumnsCollection> <CustomColumn> <Name>Brand</Name> <DataType>0</DataType> <Value>Duprim</Value> </CustomColumn> &l

在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>

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

尝试以下方法:

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'

.nodes返回XML片段列表,每个片段表示一个节点。在WHERE子句中选择一个名称值为Brand的,并获取该XML节点的值

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'

.nodes返回XML片段列表,每个片段表示一个节点。在WHERE子句中选择一个名称值为Brand的,并获取该XML节点的值

SQL

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

SQL for Excel


下面是另一个使用XPath谓词的方法

SQL

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

SQL for Excel


谢谢你的回答,但就我所知,在这个例子中我使用的是视图,不能声明变量…@Elen。在这种情况下,您可以只使用硬编码值。我更新了答案。谢谢@Yizhak,也许我可以用Excel解析它,不知道如何硬编码。我看你在那里做了什么。但是,当我将其作为MAXDISTINCT PR.CustomColumns.nodes“/CustomColumnsCollection/CustomColumn[Name/text[1]eq Brand]”作为Spec0应用于查询时,SQL server给我的错误节点是无效的函数。。。抱歉,我不熟悉在sql查询中解析XML…@Elen,如果允许,您可以从视图切换到内联函数。这样的函数将接受您的输入作为参数,并允许使用sql:variable在这个答案中输入代码。在Excel中,您可以轻松地将所需的值传递到函数中。谢谢您的回答,但在本例中,据我所知,我使用的是视图,无法声明变量…@Elen。在这种情况下,您可以只使用硬编码值。我更新了答案。谢谢@Yizhak,也许我可以用Excel解析它,不知道如何硬编码。我看你在那里做了什么。但是,当我将其作为MAXDISTINCT PR.CustomColumns.nodes“/CustomColumnsCollection/CustomColumn[Name/text[1]eq Brand]”作为Spec0应用于查询时,SQL server给我的错误节点是无效的函数。。。抱歉,我不熟悉在sql查询中解析XML…@Elen,如果允许,您可以从视图切换到内联函数。这样的函数将接受您的输入作为参数,并允许使用sql:variable在这个答案中输入代码。在Excel中,您可以轻松地将所需的值传递到函数中。我将此作为子查询从dbo.Products作为PR运行,但它没有返回任何信息…我将此作为子查询从dbo.Products作为PR运行,但它没有返回任何信息。。。。
-- 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 |
+----+--------+
SELECT ID
    , CustomColumns.value('(/CustomColumnsCollection/CustomColumn[(Name/text())[1] eq "Brand"]/Value/text())[1]', 'VARCHAR(50)') AS [Value]
FROM @tbl;