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”无效
有人能帮我解决这个问题吗?谢谢您不能在immediateWHERE
子句中使用列别名。您可以在子查询中使用它,但:
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])
不能在immediateWHERE
子句中使用列别名。您可以在子查询中使用它,但:
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()
?