xml 查询存在并包含给出意外结果

IT *_*her 0 xml sql-server sql-server-2008-r2 xquery

我有一个查询,如下所示。

DECLARE @tbl TABLE  
(   
 id INT,    
 col XML        
)   
INSERT INTO @tbl    
VALUES  
(1,'<Root>
  <Row>
    <User>xyz</User>
    <Rowid>1</Rowid>
  </Row>
  <Maxrowid>1</Maxrowid>
</Root>'),
(2,'<Root>
  <Row>
    <User>xyz</User>
    <Rowid>1</Rowid>
  </Row>
  <Row>
    <User>mnj</User>
    <Rowid>2</Rowid>
  </Row>
  <Maxrowid>2</Maxrowid>
</Root>'),(3,'<Root>
  <Row>
    <User>abs</User>
    <Rowid>1</Rowid>
  </Row>
  <Row>
    <User>xra</User>
    <Rowid>2</Rowid>
  </Row>
  <Maxrowid>2</Maxrowid>
</Root>
')  

--table before---
SELECT  *
FROM    @tbl t1
------------------

DECLARE @id varchar 
SELECT @id = 'xyz'  
SELECT  *   
FROM    @tbl t1 
WHERE col.exist('//*/text()[contains(.,sql:variable("@id"))]') = 1  
Run Code Online (Sandbox Code Playgroud)

我期待这个查询输出在 xml 列 'col' 中任何地方都有 'xyz' 的行。但它返回所有行。(当我检查它返回所有在 xml 列中包含“x”的行。所以请告诉我为什么会发生?我哪里出错了?还请纠正它。

此外,我还有另一个问题,即对上面相同的 xml 的以下查询不返回任何输出。我希望它返回 xml 列,其中任何地方都包含 'xyz'。所以也请查看它并更正我的错误。

DECLARE @id varchar 
SELECT @id = 'xyz'  
SELECT  *   
FROM    @tbl t1 
WHERE t1.col.exist('//*[text()=sql:variable("@id")]')=1 
Run Code Online (Sandbox Code Playgroud)

Mik*_*son 5

您尚未指定 的长度@idvarchar在这种情况下使用 only will 给你一个长度,所以内容@idwill 是x

您的第一个查询检查包含x并匹配所有行的节点。第二个查询检查具有x作为值且没有行具有该值的节点。

更改@idto的声明,DECLARE @id varchar(3)一切都会按预期进行。