服务器: 消息 295,级别 16,状态 3,过程 Seleuser,行 19
从字符串转换为 smalldatetime 数据类型时发生语法错误。CREATE PROCEDURE Seleuser
@Name Varchar(12),
@sex Varchar(4),
@useID Varchar(10),
@birthday smalldatetime
AS
declare @str varchar(800) 
declare @where varchar(500)set @where=' where 1=1 ' if(@Name<>'') 
set @where=@where+ ' and Name='+@Name 
if(@sex<>'') 
set @where=@where+ ' and sex='+@sex
if(@useID<>'') 
set @where=@where+ ' and useID='+@useID
if(@birthday<>'') 
set @where=@where+ ' and birthday=Convert(smalldatetime,'+@birthday+'110)'set @str = 'select * from user_info '+@where
exec(@str)
GO在查询分析器执行如下
exec seleuser '','','','2006-8-8'
go显示如下
服务器: 消息 295,级别 16,状态 3,过程 Seleuser,行 19
从字符串转换为 smalldatetime 数据类型时发生语法错误。

解决方案 »

  1.   

    CREATE PROCEDURE Seleuser 
    @Name Varchar(12), 
    @sex Varchar(4), 
    @useID Varchar(10), 
    @birthday smalldatetime 
    AS 
    declare @str varchar(800) 
    declare @where varchar(500) set @where=' where 1=1 ' if(@Name <>'') 
    set @where=@where+ ' and Name='+@Name 
    if(@sex <>'') 
    set @where=@where+ ' and sex='+@sex 
    if(@useID <>'') 
    set @where=@where+ ' and useID='+@useID 
    if(@birthday <>'') 
    set @where=@where+ ' and birthday=Convert(smalldatetime,'''+convert(varchar(10),@birthday,120)+''')' set @str = 'select * from user_info '+@where 
    exec(@str) 
    GO 
      

  2.   

    没必要转两次CREATE PROCEDURE Seleuser 
    @Name Varchar(12), 
    @sex Varchar(4), 
    @useID Varchar(10), 
    @birthday smalldatetime 
    AS 
    declare @str varchar(800) 
    declare @where varchar(500) set @where=' where 1=1 ' if(@Name <>'') 
    set @where=@where+ ' and Name='+@Name 
    if(@sex <>'') 
    set @where=@where+ ' and sex='+@sex 
    if(@useID <>'') 
    set @where=@where+ ' and useID='+@useID 
    if(@birthday <>'') 
    set @where=@where+ ' and birthday='''+convert(varchar(10),@birthday,120)+'''' set @str = 'select * from user_info '+@where 
    exec(@str) 
    GO 
      

  3.   

    set @where=@where+ ' and birthday=Convert(smalldatetime,'''+@birthday+''',110)'
      

  4.   

     ' and birthday='+cast(Convert(smalldatetime,'+@birthday+'110) as nvarchar(20))
      

  5.   

    set @where=@where+ ' and convert(varchar(10),birthday,120)='''+convert(varchar(10),@birthday,120)+'''' 
      

  6.   

    那就这样CREATE PROCEDURE Seleuser 
    @Name Varchar(12), 
    @sex Varchar(4), 
    @useID Varchar(10), 
    @birthday smalldatetime 
    AS 
    declare @str varchar(800) 
    declare @where varchar(500) set @where=' where 1=1 ' if(@Name <>'') 
    set @where=@where+ ' and Name='+@Name 
    if(@sex <>'') 
    set @where=@where+ ' and sex='+@sex 
    if(@useID <>'') 
    set @where=@where+ ' and useID='+@useID 
    if(@birthday <>'') 
    set @where=@where+ ' and datediff(day,birthday,'''+convert(varchar(10),@birthday,120)+''')=0' set @str = 'select * from user_info '+@where 
    exec(@str) 
    GO