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)
您尚未指定 的长度@id。varchar在这种情况下使用 only will 给你一个长度,所以内容@idwill 是x。
您的第一个查询检查包含x并匹配所有行的节点。第二个查询检查具有x作为值且没有行具有该值的节点。
更改@idto的声明,DECLARE @id varchar(3)一切都会按预期进行。