declare @XuZuoZhe nvarchar(200)
set @XuZuoZhe = N'Tom'
select a.id,a.BookName
 from dbo.book a left join dbo.ChuBanShe b on a.ChuBanShe_id = b.id
    where a.neirong.exist('//序/作者/姓名/text() = sql:variable("@XuZuoZhe")') = 1xml类型字段neirong中根本就没有//序/作者/姓名是Tom,正常应该没有记录显示,
但现在把所有记录都列出来了,a.neirong.exist('//序/作者/姓名/text() = sql:variable("@XuZuoZhe")') = 1根本
就没有起到作用,请问大家这是怎么回事,谢谢!!!

解决方案 »

  1.   

    create table tb(name xml)insert into tb
    select '<f><e>1</e><e>2</e></f>' union all
    select '<f><e>2</e><e>5</e></f>' union all
    select '<f><e>4</e><e>5</e></f>' declare @XuZuoZhe nvarchar(200)
    set @XuZuoZhe = N'5'select * from tb where name.exist('//e[.=sql:variable("@XuZuoZhe")]')=1/*
    name
    -----------------------
    <f><e>2</e><e>5</e></f>
    <f><e>4</e><e>5</e></f>
      

  2.   

    sqlserver的xml中xsl查询里的运算表达式需要用[]来定界。
    对于exist方法来说, 你的写法,没有语法错误的话, 结果恒为真
    正确的写法应该是
    select a.id,a.BookName
     from dbo.book a left join dbo.ChuBanShe b on a.ChuBanShe_id = b.id
        where a.neirong.exist('//序/作者/姓名[text() = sql:variable("@XuZuoZhe")]') = 1