代码之家  ›  专栏  ›  技术社区  ›  kartheeki j

从SQL Server中的XML数据中查找值?

  •  0
  • kartheeki j  · 技术社区  · 6 年前

    我想从SQL Server表中的XML数据中找到值。

    <wddxPacket version="1.0">
       <header />
       <data>
          <struct type="xyz">
             <var name="TXRGHC43">
                <string />
             </var>
             <var name="TWBS1">
                 <string>9011750</string>
             </var>
             <var name="PMNAMEID">
                <string>2323443</string>
             </var>
    
             <var name="EDATE36">
                <string />
             </var>
    
             <var name="TWBSDESC40">
                <string />
             </var>
    
          </struct>
       </data>
    </wddxPacket>
    

    我在寻找 9011750个 在下面 . 你能帮我一下吗。如何找到

    我正在尝试以下查询,但没有得到任何输出。

    select
      col
    from
      xyz
    where
      col.value('(/wddxPacket/data/struct/var[TWBS1])[2]', 'varchar(max)') like '9011750'
    
    SELECT col.value('(/wddxPacket/data/struct/var/string)[3]', 'varchar(100)')
    FROM   xyz
    

    我的要求是搜索整个表中的数据,这只是示例xml数据。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Yitzhak Khabinsky    6 年前

    请尝试以下SQL。它显示了如何在 XPath语言 要模拟的表达式 WHERE 条款。

    -- DDL and sample data population, start
    DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
    INSERT INTO @tbl (xmldata)
    VALUES
    (N'<wddxPacket version="1.0">
        <header/>
        <data>
            <struct type="xyz">
                <var name="TXRGHC43">
                    <string/>
                </var>
                <var name="TWBS1">
                    <string>9011750</string>
                </var>
                <var name="PMNAMEID">
                    <string>2323443</string>
                </var>
                <var name="EDATE36">
                    <string/>
                </var>
                <var name="TWBSDESC40">
                    <string/>
                </var>
            </struct>
        </data>
    </wddxPacket>');
    -- DDL and sample data population, end
    
    DECLARE @varName VARCHAR(20) = 'TWBS1';
    
    SELECT c.value('(./text())[1]','INT') AS [string_value]
    FROM @tbl AS tbl
        CROSS APPLY tbl.xmldata.nodes('/wddxPacket/data/struct/var[@name=sql:variable("@varName")]/string') AS t(c);
    

    输出

    +--------------+
    | string_value |
    +--------------+
    |      9011750 |
    +--------------+