本帖最后由 bx1988112 于 2011-11-29 16:18:07 编辑

解决方案 »

  1.   

    SELECT a.ID,Title,AddDate FS_News from a 
    INNER JOIN @Products b
        ON CHARINDEX(b.keyWord,a.Title)>0
        WHERE CONTAINS(Title,@contains)
        GROUP BY a.ID,Title,AddDate
        ORDER BY Sum(keyNum) DESC,COUNT(DISTINCT keyword),AddDate desc
      

  2.   

    set @sql=N'SELECT a.ID,Title,AddDate from ' +@tablename+ ' a 
      

  3.   

    不好意思  原来写了的  改成动态sql不知道怎么忘了。现在是这个错误SELECT a.ID,Title,AddDate from FS_News a 
    INNER JOIN @Products b
        ON CHARINDEX(b.keyWord,a.Title)>0
        WHERE CONTAINS(Title,@contains)
        GROUP BY a.ID,Title,AddDate
        ORDER BY Sum(keyNum) DESC,COUNT(DISTINCT keyword),AddDate desc
    消息 1087,级别 15,状态 2,第 2 行
    必须声明表变量 "@Products"。
      

  4.   


    set @sql=N'SELECT a.ID,Title,AddDate from ' +@tablename+ ' a 
    INNER JOIN '+@Products+' b
        ON CHARINDEX(b.keyWord,a.Title)>0
        WHERE CONTAINS(Title,'+@contains+')
        GROUP BY a.ID,Title,AddDate
        ORDER BY Sum(keyNum) DESC,COUNT(DISTINCT keyword),AddDate desc'
    如果写成这样的话 
    编译通不过:必须声明标量变量 @Products
      

  5.   


    @Products是一个根据关键词顺序生成的权重表,是一个临时表
      

  6.   


    alter PROCEDURE  [dbo].[NewsSearch]
    (@splitstr varchar(1000)=null) as --定义一个临时表,存储拆分后的关键词
    DECLARE @Products TABLE(id int identity ,keyWord nvarchar(255),keyNum int)
    declare @sum varchar(20);--根据拆分符拆分后的关键词
    declare @i int;--循环次数 set @sum='';
    set @i=1;

    declare @NewStr varchar(2000);
    declare @KeyNum int;--关键词数量
    set @NewStr=replace(@splitstr,'$','$$');--累加拆分符
    set @KeyNum=len(@NewStr)-len(@splitstr);--获取关键词数量
    declare @contains varchar(2000);
    set @contains='ISABOUT ('; while @i<=len(@splitstr)
    begin
    if substring(@splitstr,@i,1)='$'
    begin
    set @i=@i+1
    insert @Products select @sum,power(@KeyNum,2)--将关键词与权值存储到临时表中
    set @contains=@contains+@sum+' weight (0.'+ CONVERT(varchar(6),power(@KeyNum,2))+'),'
    set @KeyNum=@KeyNum-1;--倒排值递减
    set @sum=''
    end
    else
    begin
    set @sum=@sum+substring(@splitstr,@i,1)
    set @i=@i+1
    end
    end
    set @contains=substring(@contains,1,len(@contains)-1)+')'declare @tablename varchar(30)
    set @tablename='FS_News'
    declare @sql nvarchar(2000)
    set @sql=N'SELECT a.ID,Title,AddDate from ' +@tablename+ ' a 
    INNER JOIN '+@Products+' b
        ON CHARINDEX(b.keyWord,a.Title)>0
        WHERE CONTAINS(Title,'+@contains+')
        GROUP BY a.ID,Title,AddDate
        ORDER BY Sum(keyNum) DESC,COUNT(DISTINCT keyword),AddDate desc'print @sqlexec sp_executesql @sql
      

  7.   

    DECLARE 定义出来的表,动态是访问不到得
      

  8.   


    可以了 ,谢谢!
    alter PROCEDURE  [dbo].[NewsSearch]
    (@splitstr varchar(1000)=null) as
    drop table ##Products
    create table ##Products(id int identity ,keyWord nvarchar(255),keyNum int) --定义一个临时表,存储拆分后的关键词
    --DECLARE ##Products TABLE(id int identity ,keyWord nvarchar(255),keyNum int)
    declare @sum varchar(20);--根据拆分符拆分后的关键词
    declare @i int;--循环次数 set @sum='';
    set @i=1;

    declare @NewStr varchar(2000);
    declare @KeyNum int;--关键词数量
    set @NewStr=replace(@splitstr,'$','$$');--累加拆分符
    set @KeyNum=len(@NewStr)-len(@splitstr);--获取关键词数量
    declare @contains varchar(2000);
    set @contains=''''; while @i<=len(@splitstr)
    begin
    if substring(@splitstr,@i,1)='$'
    begin
    set @i=@i+1
    insert ##Products select @sum,power(@KeyNum,2)--将关键词与权值存储到临时表中
    set @contains=@contains+'"'+@sum+'" or '
    set @KeyNum=@KeyNum-1;--倒排值递减
    set @sum=''
    end
    else
    begin
    set @sum=@sum+substring(@splitstr,@i,1)
    set @i=@i+1
    end
    end
    set @contains=substring(@contains,1,len(@contains)-3)+''''declare @tablename varchar(30)
    set @tablename='FS_News'
    declare @sql nvarchar(2000)
    set @sql=N'SELECT a.ID,Title,AddDate from ' +@tablename+ ' a 
    INNER JOIN ##Products b
        ON CHARINDEX(b.keyWord,a.Title)>0
        WHERE CONTAINS(Title,'+@contains+')
        GROUP BY a.ID,Title,AddDate
        ORDER BY Sum(keyNum) DESC,COUNT(DISTINCT keyword),AddDate desc'print @contains
    print @sqlexec sp_executesql @sql