Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何从SQL Server中筛选年龄_Sql Server_Vb.net_Sql Server 2008 - Fatal编程技术网

Sql server 如何从SQL Server中筛选年龄

Sql server 如何从SQL Server中筛选年龄,sql-server,vb.net,sql-server-2008,Sql Server,Vb.net,Sql Server 2008,我试图使用组合框在datagridview上创建一个过滤器。 我想做的是在datagridview中过滤过滤数据。 我有七个用于过滤的组合框。例如,第一个组合框用于年份,然后我仍然希望将搜索过滤到等级级别,然后过滤到部分,依此类推。因此,用户将能够从数据库中对其搜索进行排序或过滤 到目前为止,我已经有了存储过程代码,并在组合框中尝试了它。学年,年级,部分,性别,状态,账户过滤效果良好。。除了年龄,我将查询设置为自动计算年龄而不保存到数据库中,现在的问题是过滤年龄 我这样做了我的存储过程 ALTE

我试图使用组合框在
datagridview
上创建一个过滤器。 我想做的是在
datagridview
中过滤过滤数据。 我有七个用于过滤的
组合框。例如,第一个
组合框
用于年份,然后我仍然希望将搜索过滤到等级级别,然后过滤到部分,依此类推。因此,用户将能够从数据库中对其搜索进行排序或过滤

到目前为止,我已经有了存储过程代码,并在组合框中尝试了它。
学年
年级
部分
性别
状态
账户
过滤效果良好。。除了年龄,我将查询设置为自动计算年龄而不保存到数据库中,现在的问题是过滤年龄

我这样做了我的存储过程

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,16级,状态1,程序uspYearGradeFilter,第42行
列名“Age”无效


有人能帮我解决这个问题吗?谢谢

您不能在immediate
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])

不能在immediate
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])

嗨,菲利克斯,我试你的代码时出错了。它说,
为“t”多次指定了“生日”列删除subqery的第二个生日。嗨,Felix,我在尝试你的代码时出错了。它说,
为“t”多次指定了“生日”列删除子目录中的第二个生日。旁注:您究竟为什么要使用
nvarchar(20)
作为参数,例如
@Year
,它显然是一个数值?请始终使用最合适的数据类型-对数值使用数字类型,对日期和时间使用日期和时间类型-而不仅仅是字符串@marc_s-难道你不知道现代风格是每个变量都被声明为字符串,然后在使用时都有一个
.ToString()
?旁注:你到底为什么要使用
nvarchar(20)
作为一个参数,比如
@Year
,它显然是一个数值?请始终使用最合适的数据类型-对数值使用数字类型,对日期和时间使用日期和时间类型-而不仅仅是字符串@marc_s-难道你不知道现代风格是每一个变量都被声明为字符串,然后在使用时都有一个
.ToString()