CREATE      procedure [dbo].checkrpt
@marcid char(32),
@isbn varchar(20),  --isbn
@ztm nvarchar(255), --题名
@fjh varchar(255),
@IsRpt int OUTPUTas declare @strSQL   nvarchar(4000)
if (@isbn<>'') and (@ztm<>'') 
begin
if (@fjh='') or (@fjh=null)
  set @strSQL='select * from check_rpt where isbn='+@isbn +' and title='+@ztm
        else
          set @strSQL='select * from check_rpt where isbn='+@isbn +' and ztm='+@ztm +' and f2='+@fjh
        
        print @strSQL
        exec(@strSQL)     
if @@rowcount =0   --如果表中不存在记录 则写入表
begin
          --写入表
          set @strSQL='insert into check_rpt (marcid,isbn,ztm,f2) values('+@marcid+','+@isbn+','+@ztm+','+@fjh+')' 
          exec(@strSQL)
          return 0
        end 
else
          
           return 1
          end 
print @strSQL 变为null了   
这个 实现简单功能  查重一个表 如果不存在记录则insert 否则返回 1 说明已经有记录了  存储过程写的少  我快笨死了

解决方案 »

  1.   

    关键是有什么问题呢?print @strSQL 变为null 证明没有值嘛
      

  2.   

    参数出现null值,字符串+null会导致结果为null
      

  3.   

    给@strSQL   赋一个初始值
    CREATE      procedure [dbo].checkrpt
    @marcid char(32),
    @isbn varchar(20),  --isbn
    @ztm nvarchar(255), --题名
    @fjh varchar(255),
    @IsRpt int OUTPUTas declare @strSQL   nvarchar(4000)
    set @strSQL=''  if (@isbn<>'') and (@ztm<>'') 
    begin
        if (@fjh='') or (@fjh=null)
          set @strSQL='select * from check_rpt where isbn='+@isbn +' and title='+@ztm
            else
              set @strSQL='select * from check_rpt where isbn='+@isbn +' and ztm='+@ztm +' and f2='+@fjh
            
            print @strSQL
            exec(@strSQL)     
        if @@rowcount =0   --如果表中不存在记录 则写入表
        begin
              --写入表
              set @strSQL='insert into check_rpt (marcid,isbn,ztm,f2) values('+@marcid+','+@isbn+','+@ztm+','+@fjh+')' 
              exec(@strSQL)
              return 0
            end 
        else
              
               return 1
              end 
      

  4.   

    CREATE      procedure [dbo].checkrpt
    @marcid char(32),
    @isbn varchar(20),  --isbn
    @ztm nvarchar(255), --题名
    @fjh varchar(255),
    @IsRpt int OUTPUTas declare @strSQL   nvarchar(4000)
    if (@isbn<>'') and (@ztm<>'') 
    begin
        if isnull(@fjh,'')=''      
            set @strSQL='select * from check_rpt where isbn='+@isbn +' and title='+@ztm
        else
            set @strSQL='select * from check_rpt where isbn='+@isbn +' and ztm='+@ztm +' and f2='+@fjh
            
            print @strSQL
            exec(@strSQL)     
        if @@rowcount =0   --如果表中不存在记录 则写入表
        begin
              --写入表
              set @strSQL='insert into check_rpt (marcid,isbn,ztm,f2) values('+@marcid+','+@isbn+','+@ztm+','+@fjh+')' 
              exec(@strSQL)
              set @IsRpt=0  
            end 
        else
            set @IsRpt=1       end 
      

  5.   

    给@strSQL   赋一个初始值
    CREATE      procedure [dbo].checkrpt
    @marcid char(32),
    @isbn varchar(20),  --isbn
    @ztm nvarchar(255), --题名
    @fjh varchar(255),
    @IsRpt int OUTPUTas declare @strSQL   nvarchar(4000)
    set @strSQL=''  if (@isbn<>'') and (@ztm<>'') 
    begin
        if (@fjh='') or (@fjh=null)
          select @strSQL=@strSQL+'select * from check_rpt where isbn='+@isbn +' and title='+@ztm
            else
           select @strSQL=@strSQL+'select * from check_rpt where isbn='+@isbn +' and ztm='+@ztm +' and f2='+@fjh
            
            print @strSQL
            exec(@strSQL)     
        if @@rowcount =0   --如果表中不存在记录 则写入表
        begin
              --写入表
             select @strSQL=@strSQL+'insert into check_rpt (marcid,isbn,ztm,f2) values('+@marcid+','+@isbn+','+@ztm+','+@fjh+')' 
              exec(@strSQL)
              return 0
            end 
        else
              
               return 1
              end 
      

  6.   


    原来是这样呀 另外 我想利用  if not exists (@strSQL)   判断 这么写怎么不对  而这么写就对  if not exists (select xx from ....) 我的sql 是变量 
      

  7.   


    CREATE      procedure [dbo].checkrpt
    @marcid char(32),
    @isbn varchar(20),  --isbn
    @ztm nvarchar(255), --题名
    @fjh varchar(255),
    @IsRpt int OUTPUTas 
    declare @strSQL   nvarchar(4000)
    if (@isbn<>'') and (@ztm<>'') 
    begin
        if (@fjh='') or (@fjh is null)
          set @strSQL='select * from check_rpt where isbn='+isnull(@isbn,'''''') +' and title='+isnull(@ztm,'''''')
            else
              set @strSQL='select * from check_rpt where isbn='+isnull(@isbn,'''''') +' and ztm='+isnull(@ztm,'''''') +' and f2='+isnull(@fjh,'''''')
            
            print @strSQL
            exec(@strSQL)     
        if @@rowcount =0   --如果表中不存在记录 则写入表
        begin
              --写入表
              set @strSQL='insert into check_rpt (marcid,isbn,ztm,f2) values('+isnull(@marcid,'''''')+','+isnull(@isbn,'''''')+','+isnull(@ztm,'''''')+','+isnull(@fjh,'''''')+')' 
              exec(@strSQL)
              return 0
            end 
        else
               return 1
    end 
      

  8.   

    @@rowcount  感觉效率不高 想用 exists 判断  怎么写
    解决此问题 即可结贴
      

  9.   

    if (select count(1) from check_rpt)>1
      

  10.   


    这是啥意思吗  我的 sql 要加 where 条件的 
      

  11.   

    现在 主要问题集中到  如何高效的 写查重判断  不想 select *     @@rowcount  这样判断 返回东西太多了 没必要想用 count()  或者 if not  exists 注意 这里 sql  是变量 @strSQL   
      

  12.   

    如果是考虑效率,@@rowcount判断是最高的,你的NOT EXISTS想法很难实现
      

  13.   


    CREATE      procedure [dbo].checkrpt
    @marcid char(32),
    @isbn varchar(20),  --isbn
    @ztm nvarchar(255), --题名
    @fjh varchar(255),
    @IsRpt int OUTPUTas 
    IF  EXISTS(SELECT 1 FROM check_rpt WHERE isbn=@isbn AND title=@ztm AND f2=ISNULL(@fjh,f2))
    RETURN 0
    --写入表
    insert into check_rpt (marcid,isbn,ztm,f2) values(@marcid,@isbn,@ztm,@fjh)
    RETURN 1
      

  14.   

    樓主這是判斷存在時 return 0
    不存在新增 return 1不需要用動態貼出來的語句也有問題@marcid char(32),
    @isbn varchar(20),  --isbn
    @ztm nvarchar(255), --题名
    @fjh varchar(255),字符串加時要在兩邊加引號
    set @strSQL='select * from check_rpt where isbn='''+@isbn +''' and title='''+@ztm+''''
      

  15.   

    楼上说的句句 命中要害呀 我都改过来了
    目前我这样 判断 较之前的 效率会不会高些 if isnull(@fjh,'')=''
      set @strSQL='select count(1) from check_rpt where isbn='''+@isbn +''' and ztm='''+@ztm+'''  having count(*)>=1'
            else
              set @strSQL='select count(1) from check_rpt where isbn='''+@isbn +''' and ztm='''+@ztm +''' and f2='''+@fjh+''''
            
            --print @strSQL
            exec(@strSQL)     
    if @@rowcount =0   --如果表中不存在记录 则写入表