这样的一个查询的存储过程该怎么写呢?查询条件有三个:UserTypeID(用户类型) UserName(用户名) Activity(状态)要求:1、可以同时选择以上的三个条件进行查询;
      2、也可以选择其中的一个两个条件进行查询;
      3、UserName(用户名)这个必须可以使用模糊查询。 请教,这能整合到一个存储过程中吗?

解决方案 »

  1.   

    CREATE   procedure p_Query
     @UserTypeID nvarchar(4)
     @UserName nvarchar(4)
     @Activity nvarchar(4)
    as 
      declare @Sql varchar(200)   
      set @Sql='select * from Tb'
     if(@UserTypeID <>'')
        begin
         set @Sql=@sql+' and UserTypeID ='''+@UserTypeID +''''
        end
      if(@UserName <>'')
        begin
         set @Sql=@sql+' and UserName like ''%'+@UserName +'%'''
        end   if(@Activity <>'')
        begin
         set @Sql=@sql+' and Activity like ''%'+@Activity +'%'''
        end
     exec (@sql)
      

  2.   

    我测试的整个存储过程是这样的:ALTER  PROCEDURE [dbo].[GetSearchUserM]
    (
    @UserTypeID int,
    @UserName varchar(50),
    @Activity char (4)
    )
    as 
      declare @Sql varchar(200)  
      set @Sql='select u.UserID,u.UserName,u.Sex,u.Birthday,u.Photo,u.Phone,u.Email,u.EmployeeID,d.DepartmentName,u.Activity,t.UserTypeName,u.UserTypeID,d.DepartmentID
    from TB_Users u,TB_Department d,TB_UserType t
    where u.DepartmentID=d.DepartmentID and u.UserTypeID=t.UserTypeID ' 
    if(@UserTypeID <>'') 
        begin 
        set @Sql=@sql+' and UserTypeID ='''+@UserTypeID +'''' 
        end 
      if(@UserName <>'') 
        begin 
        set @Sql=@sql+' and UserName like ''%'+@UserName +'%''' 
        end   if(@Activity <>'') 
        begin 
        set @Sql=@sql+' and Activity ='''+@Activity +'''' 
        end 
    exec (@sql)
    执行后出现这样的 提示EXEC @return_value = [dbo].[GetSearchUserM]
    @UserTypeID = 1,
    @UserName = N'a',
    @Activity = N'可用'SELECT 'Return Value' = @return_value
    消息 245,级别 16,状态 1,过程 GetSearchUserM,第 38 行
    在将 varchar 值 'select u.UserID,u.UserName,u.Sex,u.Birthday,u.Photo,u.Phone,u.Email,u.EmployeeID,d.DepartmentName,u.Activity,t.UserTypeName,u.UserTypeID,d.DepartmentID
    from TB_Users u,TB_Department d,TB_UserType t
     and UserTypeID ='' 转换成数据类型 int 时失败。恕我愚昧,为什么有这样提示呢?
      

  3.   

    @UserTypeID是int类型,你是按字符类型处理的
      

  4.   

    类型不匹配,cast(+@UserTypeID  as varchar)
      

  5.   


    create  procedure p_Query 
    (
    @UserTypeID nvarchar(10) 
    @UserName nvarchar(50) 
    @Activity nvarchar(100) 
    as 
    begin
       declare @Sql varchar(max)  
       set @Sql='select * from Tb' 
    if(@UserTypeID !='') 
         begin 
         set @Sql=@sql+' and UserTypeID ='+@UserTypeID  
         end 
       if(@UserName !='') 
         begin 
         set @Sql=@sql+' and UserName like ''%'+@UserName +'%''' 
           end   if(@Activity !='') 
         begin 
         set @Sql=@sql+' and Activity like ''%'+@Activity +'%''' 
        end 
    execute (@sql)
    end
    将@UserTypeID由整型转化成varchar型
      

  6.   

     set @Sql=@sql1+' and UserTypeID ='''+ cast(+@UserTypeID as varchar)+'''' 转换后还是不成功,
    我传一个空值给UserTypeID 测试了一下其他的两个,发现没有达到预期的效果  
      

  7.   

    写错了
    cast(@UserTypeID as varchar)应为字符串型
      

  8.   

    刚才我尝试转换的时候写 了 一个sql1没改回来,
    现在,
    转换成功,完整的存储工程是这样的:ALTER  PROCEDURE [dbo].[GetSearchUserM]
    (
    @UserTypeID int,
    @UserName varchar(50),
    @Activity char (4)
    )
    as 
      declare @Sql varchar(200)
    declare @sql1 int
      set @Sql='select u.UserID,u.UserName,u.Sex,u.Birthday,u.Photo,u.Phone,u.Email,u.EmployeeID,d.DepartmentName,u.Activity,t.UserTypeName,u.UserTypeID,d.DepartmentID
    from TB_Users u,TB_Department d,TB_UserType t
    where u.DepartmentID=d.DepartmentID and u.UserTypeID=t.UserTypeID ' 
    if(@UserTypeID <>'') 
        begin 
        set @Sql=@sql+' and UserTypeID ='''+ cast(@UserTypeID as varchar)+'''' 
        end 
      if(@UserName <>'') 
        begin 
        set @Sql=@sql+' and UserName like ''%'+@UserName +'%''' 
        end   if(@Activity <>'') 
        begin 
        set @Sql=@sql+' and Activity ='''+@Activity +'''' 
        end 
    exec (@sql)但是新的问题又暴露出来 了,这个存储过程把全部的数据都检索出来了,而且同一条记录重复的次数很多  
    无法达到预期的限制的效果:1、可以同时选择以上的三个条件进行查询; 
                              2、也可以选择其中的一个或两个条件进行查询; 
                              3、UserName(用户名)这个必须可以使用模糊查询。 
      

  9.   

    select * 表 where 
    (UserID is null or UserID=@UserID) and 
    (isnull(@Activity,'')='' or Activity=@Activity) and 
    (isnull(@UserName,'')='' or UserName like '%' + @UserName + '%")
      

  10.   

    胡扯,就一句select * from 单个表,无论where条件再怎么不对,出来的东西也不可能多我估计是你从多个表里select,在join的时候条件没有匹配好,才会多出来
      

  11.   

    嗯 我是多个表联合查询的,select u.UserID,u.UserName,u.Sex,u.Birthday,u.Photo,u.Phone,u.Email,u.EmployeeID,u.Activity,u.UserTypeID,d.DepartmentName,t.UserTypeName,d.DepartmentID
    from TB_Users u,TB_Department d,TB_UserType t
    where u.DepartmentID=d.DepartmentID and u.UserTypeID=t.UserTypeID我的这个查询语句查出来的 的也和数据库的记录一样,然后到添加后来那部分的条件的时候就出现了重复记录的问题。