我想在存储过程里拼接一个sql语句,如果一个参数不为空就拼入这个sql语句,最后去掉最后一个and,并执行这个sql语句。哎,总是调不通,请高手帮忙呀CREATE PROCEDURE WHTEL_search_AllTel
(
@jxy nvarchar(50),
@kssj smalldatetime,
@jssj smalldatetime,
@ldhm nvarchar(50),
@ldr nvarchar(50)
)
as
declare @Sql nvarchar(4000)
set @Sql='select * from tel_info where 'if(@jxy<>'')
begin
set @Sql=@Sql+'jxy like ''%'''+@jxy+'''%'' and '
endif(@ldhm<>'')
begin
set @Sql=@Sql+'ldhm like ''%'''+@ldhm+'''%'' and '
end.....exec @Sql
GO

解决方案 »

  1.   

    你换一个想法呢
    CREATE PROCEDURE WHTEL_search_AllTel
    (
    @jxy nvarchar(50),
    @kssj smalldatetime,
    @jssj smalldatetime,
    @ldhm nvarchar(50),
    @ldr nvarchar(50)
    )
    as
    declare @Sql nvarchar(4000)
    set @Sql='select * from tel_info where 1=1'if(@jxy<>'')
    begin
    set @Sql=@Sql+'and jxy like ''%'''+@jxy+'''%'' '
    endif(@ldhm<>'')
    begin
    set @Sql=@Sql+' and ldhm like ''%'''+@ldhm+'''%'''
    end.....exec @Sql
    GO
      

  2.   

    嗯 多谢你帮我解决的and的问题这个语句里的单引号好像还是不对
      

  3.   

    从字符串转换为 smalldatetime...数据类型时发生语法错误
      

  4.   

    单引号的问题解决!请看下面的代码,同时注意“1=1”CREATE  PROCEDURE WHTEL_search_AllTel
    (
    @jxy nvarchar(50),
    @kssj smalldatetime,
    @jssj smalldatetime,
    @ldhm nvarchar(50),
    @ldr nvarchar(50)
    )
    as
    declare @Sql nvarchar(4000)
    set @Sql='select * from tel_info where 1=1 'if(@jxy<>'')
    begin
    set @Sql=@Sql+' and jxy like ''%'+@jxy+'%'''
    endif(@ldhm<>'')
    begin
    set @Sql=@Sql+' and ldhm like ''%'+@ldhm+'%'''
    end.....exec @Sql
      

  5.   

    LZ测试的时候可以将变量的值打印出来看。见下面的测试
    CREATE PROCEDURE WHTEL_search_AllTel
    (
    @jxy nvarchar(50),
    @kssj smalldatetime,
    @jssj smalldatetime,
    @ldhm nvarchar(50),
    @ldr nvarchar(50)
    )
    as
    declare @Sql nvarchar(4000)
    set @Sql='select * from tel_info where 1=1 'if(@jxy<>'')
    begin
    set @Sql=@Sql+' and jxy like ''%'+@jxy+'%'''
    endif(@ldhm<>'')
    begin
    set @Sql=@Sql+' and ldhm like ''%'+@ldhm+'%'''
    endprint @Sql
    go
    exec WHTEL_search_AllTel 'aaaaa','2006-8-9','2006-9-9','bbbbb','ccccc'
      

  6.   

    好了 马上给分!不过有点不明白1、1=1的目的是什么2、时间还是有点问题:从字符串转换为 smalldatetime...数据类型时发生语法错误
    subsj between '+@kssj+' and '+@jssj+'
      

  7.   

    1、1=1 的目的是防止所有的参数都为空,则拼凑起来的SQL语句中就缺少了where后的条件2、datetime是可以用字符串的方式传的啊