CREATE PROCEDURE [MyPro_ByNKey]
@Nkey Nvarchar(200)
AS
declare @s nvarchar(4000)
set @s='insert # select re='''+replace(@s, ',', ''' union select ''')+''''
create table #(nkey nvarchar(2000))
exec(@s)
SELECT * from News a 
where exists(
    select * from # where charindex(','+Nkey+',',','+a.NKey+',')>0)
go这是他写的一个解决相关新闻的存储过程
表结构是:
[ID],[Title],[Content],[Nkey],[RegDate]字段 [Nkey],是存储关键字:如"中国,美国".
我照着做了,但就是查不出来,特别是模糊查询的问题上,这样写好像不能模糊查询.
希望能得到高手的帮助.
期盼佳音,谢谢!

解决方案 »

  1.   

    换成 patindex 并且前后加上%看看. 
    patindex (',%'+Nkey+'%,',','+a.NKey+',')>0)
      

  2.   

    declare @s nvarchar(4000)
    set @s='insert # select re='''+replace(@s, ',', ''' union select ''')+''''在声明@s之后,@s是个空值即 NULL
    @s='insert ....' + replace(NULL,',',''' union ....
    NULL与字串或数值进行运算仍为NULL,所以结果仍为NULL
    不知道你想干什么.
      

  3.   

    你想将传入的字串中 , 替换成 UNION SELECT 
    比如 a,b,c
    将成为
    select x='a' union select 'b' union select 'c'
    行成
    a
    b
    c
    这样的行集,再利用charindex进行连接以达到搜索的结果.
    很明显,你将@nkey写成@s了set @s='select x='''+ replace(@nkey,',',''' union all select ''')
    exec('select a.* from news a inner join (' + @s + ''')b on charindex('',''+x+'','',
    '',''+nkey+'','')>0')
      

  4.   

    如果你是要实现模糊查询,那么不需要在 charindex匹配时前后加','
    加','是用于在元素项间查匹配.
    比如
    某字段存储格式如下
    1,22,vv,dd --这是一个字段
    此时要查此表中该字段中含22这个元素的记录,此时才加','来匹配. 否则如果里面不存在22而是221那么也会被误取到.如果你是实现模糊查询,那么直接:
    set @s='select x='''+ replace(@nkey,',',''' union all select ''')
    exec('select a.* from news a inner join (' + @s + ''')b on charindex(x,nkey)>0')
    即可.
    当然,也可以换用like或patindex