2016-04-27 55 views
0

我试图使用comboboxdatagridview上创建筛选器。 我想要做的是过滤datagridview中的过滤数据。 我有7个comboboxes过滤。例如,第一个combobox是为年,然后我仍然想要过滤搜索到年级,然后到部分等。因此,用户将能够从数据库中排序或过滤他的搜索。如何从SQL Server中筛选年龄

到目前为止,我有我的存储过程代码,并在组合框中试过。 SchoolYear,Grade,section,Gender,, status, Account过滤效果很好..除了年龄,我设置我的查询来自动计算年龄而不保存到数据库中,现在我的问题是过滤年龄。

我这样做了我的存储过程。

ALTER PROCEDURE [dbo].[uspYearGradeFilter] 
    @Year Nvarchar(20) = NULL, 
    @Grade Nvarchar(20) = NULL, 
    @Section Nvarchar(20) = NUll, 
    @Gender Nvarchar(20) = NULL, 
    @Status Nvarchar(20) = NULL, 
    @Status2 Nvarchar(20) = NULL, 
    @Age Nvarchar(20) = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT 
     si.StudentID, SI.Surname, SI.FirstName, SI.MiddleName, 
     si.Gender, si.BirthDay, SI.TelNum, 
     Birthday, getdate() AS [Today], 
     Datediff(yy, BirthDay, getdate()) - 
      CASE 
       WHEN DATEADD(YY, DATEDIFF(YY, BirthDay, getdate()), BirthDay) > GETDATE() 
        THEN 1 
        ELSE 0 
      END AS [age] 
    FROM 
     StudentInformation SI 
    JOIN 
     StudentHistory SH ON SI.StudentID = SH.StudentID 
    WHERE 
     sh.SchoolYear LIKE COALESCE('%'+ @Year+'%', sh.SchoolYear) 
     AND sh.Levels LIKE COALESCE('%' + @Grade + '%', sh.Levels) 
     AND SI.Gender LIKE COALESCE('%' + @Gender + '%', si.gender) 
     AND SH.Section LIKE COALESCE('%' + @Section + '%', sh.Section) 
     AND Si.Status LIKE COALESCE('%' + @Status + '%', si.status) 
     AND Sh.Status2 LIKE COALESCE(@Status2 + '%', sh.status2) 
     AND [Age] LIKE COALESCE('%' + @Age + '%', [Age]) 
END 

但我得到一个错误:

Msg 207, Level 16, State 1, Procedure uspYearGradeFilter, Line 42
Invalid column name 'Age'

可有人请帮我解决这个问题?谢谢

+0

边注:您可以在子查询中,虽然使用它为什么地球上**您使用'为nvarchar(20)**'像一个参数'@ Year'这显然** **是数值?请始终使用*最合适的*数据类型 - 对数值使用数字类型,对日期和时间使用日期和时间类型 - 不只是所有内容的字符串! –

+0

@marc_s - 你不知道现代风格是每一个变量被声明为字符串,然后有一个'.ToString()'每当它被使用? – Hogan

回答

2

您不能在立即WHERE子句中使用列别名。

SELECT * FROM 
(
    SELECT 
     si.StudentID, 
     SI.Surname, 
     SI.FirstName, 
     SI.MiddleName, 
     si.Gender, 
     si.BirthDay, 
     SI.TelNum 
     getdate() AS [Today], 
     Datediff(yy,BirthDay,getdate()) - 
        CASE 
         WHEN DATEADD(YY, DATEDIFF(YY,BirthDay,getdate()),BirthDay) > GETDATE() 
          THEN 1 
         ELSE 
          0 
        END AS [age] 
    FROM StudentInformation SI 
    JOIN StudentHistory SH 
     ON SI.StudentID = SH.StudentID 
    WHERE 
     sh.SchoolYear LIKE COALESCE('%'+ @Year+'%', sh.SchoolYear) 
     AND sh.Levels LIKE COALESCE('%' + @Grade + '%', sh.Levels) 
     AND SI.Gender LIKE COALESCE('%' + @Gender + '%', si.gender) 
     AND SH.Section LIKE COALESCE('%' + @Section + '%', sh.Section) 
     AND Si.Status LIKE COALESCE('%' + @Status + '%', si.status) 
     AND Sh.Status2 LIKE COALESCE(@Status2 + '%', sh.status2) 
) t 
WHERE [Age] LIKE COALESCE('%' + @Age + '%', [Age]) 
+0

嗨费利克斯,当我尝试你的代码时出现错误。它说'专栏'生日'被多次指定为't'。 ' –

+0

删除子问题中的第二个生日。 –

+0

谢谢菲利克斯,它完美的作品:-) –