SQL select查询根据xml节点值获取记录?

Dot*_*per 5 xml sql

我有一列ntext数据类型和非XML.它存储所有xml数据.我需要根据xml节点值获取记录.=>输入值是CpsiaId = 456并且应该返回在xml中具有此值的所有记录

我试过了 select * from tableName where convert(xml,column_name).value('data((/root/ProductInformation/CPSIA/CpsiaDetails/Item/CpsiaId)[1])','int') = 456

但它没有工作....任何想法或其他方式获取基于xml节点值的记录.

示例Xml:

<root>
  <ProductInformation>
    <Name> Truck with Battery Charger</Name>
    <Description>Fr.</Description>
    <CPSIA>
      <CpsiaDetails>
        <Item>
          <CpsiaId>456</CpsiaId>
          <CpsiaMessage>waring</CpsiaMessage>
        </Item>
        <Item>
          <CpsiaId>236</CpsiaId>
          <CpsiaMessage>to health</CpsiaMessage>
        </Item>
      </CpsiaDetails>
    </CPSIA>
  </ProductInformation>
</root>
Run Code Online (Sandbox Code Playgroud)

Luc*_*ero 4

convert(xml,column_name).exist('/root/ProductInformation/CPSIA/CpsiaDetails/Item[CpsiaId=456]') = 1
Run Code Online (Sandbox Code Playgroud)

这是可行的,如果您需要动态值,您可以将常量 ( 456) 替换为 an sql:variable(),如下所示(假设是数字变量@i):

'/root/ProductInformation/CPSIA/CpsiaDetails/Item[CpsiaId=sql:variable("@i")]'
Run Code Online (Sandbox Code Playgroud)

编辑:

根据要求的示例代码:

DECLARE @t nvarchar(MAX);
SET @t = '<root>
  <ProductInformation>
    <Name> Truck with Battery Charger</Name>
    <Description>Fr.</Description>
    <CPSIA>
      <CpsiaDetails>
        <Item>
          <CpsiaId>456</CpsiaId>
          <CpsiaMessage>waring</CpsiaMessage>
        </Item>
        <Item>
          <CpsiaId>236</CpsiaId>
          <CpsiaMessage>to health</CpsiaMessage>
        </Item>
      </CpsiaDetails>
    </CPSIA>
  </ProductInformation>
</root>'

DECLARE @i int;
SET @i = 456;

SELECT convert(xml,@t).exist('/root/ProductInformation/CPSIA/CpsiaDetails/Item[CpsiaId=sql:variable("@i")]')
Run Code Online (Sandbox Code Playgroud)