CREATE PROCEDURE PROCdormreport @NO varchar(10),@dept varchar(10),@louhao varchar(10),
       @fanghao varchar(10),@zufang varchar(10)
AS
set  xact_abort on
begin tran
if rtrim(ltrim(@NO))<>''
select *  into #temp1 from tbldorm
where [no]=@no
else
select *  into #temp1 from tbldorm if rtrim(ltrim(@dept))<>''
select * into #temp2 from #temp1
where dept=@dept
else
select * into #temp2 from #temp1 drop table #temp1 if rtrim(ltrim(@louhao))<>''
select * into #temp3 from #temp2
where louhao=@louhao
else
select * into #temp3 from #temp2 drop table #temp2 if rtrim(ltrim(@fanghao))<>''
select * into #temp4 from #temp3
where fanghao=@fanghao
else
select * into #temp4 from #temp3

drop table #temp3 if rtrim(ltrim(@zufang))<>''
select * into #temp5 from  temp4
where zufang=@zufang
else
select * into #temp5 from  temp4 drop table #temp4

select * from #temp5
commit tran
当我检查语法准备存储这个存储过程时,sql server 老是提示说数据库空已经存在上面的临时表,不知道是什么原因?

解决方案 »

  1.   

    sql语法检查上的限制, 这样的语法sql是检查通不过的.
    if rtrim(ltrim(@NO))<>''
    select *  into #temp1 from tbldorm
    where [no]=@no
    else
    select *  into #temp1 from tbldorm
      

  2.   

    -- 改动态语句就行了.
    CREATE PROCEDURE PROCdormreport @NO varchar(10),@dept varchar(10),@louhao varchar(10),
           @fanghao varchar(10),@zufang varchar(10)
    AS
    declare @s nvarchar(4000)
    set @s = '
    set  xact_abort on
    begin tran'
    if rtrim(ltrim(@NO))<>''
    set @s=@s + N'
    select *  into #temp1 from tbldorm
    where [no]=@no'
    else
    set @s=@s + N'
    select *  into #temp1 from tbldorm'if rtrim(ltrim(@dept))<>''
    set @s=@s + N'
    select * into #temp2 from #temp1
    where dept=@dept'
    else
    set @s=@s + N'
    select * into #temp2 from #temp1' set @s=@s + N'
    drop table #temp1'if rtrim(ltrim(@louhao))<>''
    set @s=@s + N'
    select * into #temp3 from #temp2
    where louhao=@louhao'
    else
    set @s=@s + N'
    select * into #temp3 from #temp2' set @s=@s + N'
    drop table #temp2'if rtrim(ltrim(@fanghao))<>''
    set @s=@s + N'
    select * into #temp4 from #temp3
    where fanghao=@fanghao'
    else
    set @s=@s + N'
    select * into #temp4 from #temp3' set @s=@s + N'
    drop table #temp3'if rtrim(ltrim(@zufang))<>''
    set @s=@s + N'
    select * into #temp5 from  temp4
    where zufang=@zufang'
    else
    set @s=@s + N'
    select * into #temp5 from  temp4' set @s=@s + N'
    drop table #temp4
    select * from #temp5
    commit tran'
    exec sp_executesql @s, N'
    @NO varchar(10),@dept varchar(10),@louhao varchar(10),
           @fanghao varchar(10),@zufang varchar(10)',
    @NO, @dept, @louhao, @fanghao, @zufang
      

  3.   

    改成这样试试:
    CREATE PROCEDURE PROCdormreport @NO varchar(10),@dept varchar(10),@louhao varchar(10),
           @fanghao varchar(10),@zufang varchar(10)
    AS
    set  xact_abort on
    begin tran
    select *  into #temp1 from tbldorm
    where ([no]=@no and @No <> '') or @No = ''

    select * into #temp2 from #temp1
    where (dept=@dept and @dept <> '') or @dept = '' select * into #temp3 from #temp2
    where (louhao=@louhao and @louhao <> '') or @louhao = '' select * into #temp4 from #temp3
    where (fanghao=@fanghao and @fanghao <> '') or @fanghao = ''

    select * into #temp5 from  temp4
    where (zufang=@zufang and @zufang <> '') or @zufang = ''

    select * from #temp5 drop table #temp1
    drop table #temp2
    drop table #temp3
    drop table #temp4
    drop table #temp5commit tran
      

  4.   

    -- 从得到结果的角度来处理的, 这样就可以了
    CREATE PROCEDURE PROCdormreport @NO varchar(10),@dept varchar(10),@louhao varchar(10),
           @fanghao varchar(10),@zufang varchar(10)
    AS
    select *  from tbldorm
    where (@NO = '' OR [no]=@no)
    AND (@dept = '' OR dept=@dept)
    AND (@louhao = '' OR louhao=@louhao)
    AND (@fanghao = '' OR fanghao=@fanghao)
    AND (@zufang = '' OR zufang=@zufang)
      

  5.   

    你怎么这么聪明啊.想到这么简单的办法,我以前都是在前台实现的,想用存储过程实现,老是因为null的原因没能实现.哎!差距啊!