Sql server SQL-在SELECT语句和WHERE子句中将变量用作列
我正试图从我们的考勤数据库SQLServer2008中提取上一节课迟到的学生。考勤期间存储在附件A1、附件A2。。。附件A7。我想安排一个作业,从早上9点开始,每小时运行一次,然后拉那些迟到的学生,但我想不出代码 以下是我的代码伪代码:Sql server SQL-在SELECT语句和WHERE子句中将变量用作列,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正试图从我们的考勤数据库SQLServer2008中提取上一节课迟到的学生。考勤期间存储在附件A1、附件A2。。。附件A7。我想安排一个作业,从早上9点开始,每小时运行一次,然后拉那些迟到的学生,但我想不出代码 以下是我的代码伪代码: Declare @Period varchar(6) Set @Period = 'att.a' + Cast((DATENAME(hour, GETDATE()) - 8) as varchar(1)) Select SC, SN, DT, @Period
Declare @Period varchar(6)
Set @Period = 'att.a' + Cast((DATENAME(hour, GETDATE()) - 8) as varchar(1))
Select SC, SN, DT, @Period as Period, ATT.A1
From ATT
Where SC = '9' and @Period = 'T'
and DT = DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
当我使用这个时,我没有得到任何结果。如果我从Where子句中删除@Period='T',我将得到以下结果:
9 5177 2012-08-24 00:00:00.000 att.a1 T
9 5211 2012-08-24 00:00:00.000 att.a1
9 5225 2012-08-24 00:00:00.000 att.a1 T
9 5229 2012-08-24 00:00:00.000 att.a1 T
9 5235 2012-08-24 00:00:00.000 att.a1 V
9 5242 2012-08-24 00:00:00.000 att.a1 T
9 5268 2012-08-24 00:00:00.000 att.a1
我知道当我在SELECT语句和WHERE子句中使用@Period时,它使用的是@Period的文本字符串值,但我需要它将@Period的值用作Table.Column
所以,在9:00它将从ATT.A1中选择,10:00从ATT.A2中选择。。。从ATT.A7开始15:00,每次比较ATT.A是否为'T'
我希望这是清楚的
谢谢,
AnthonySql Server区分了包含列名的字符串和列名本身,因此您需要使用动态Sql或case语句将字符串转换为实际列名,如下所示: 案例陈述我推荐这个: 动态Sql:
在查询中使用GetDate是在追逐移动目标,影响性能,并可能产生奇怪的结果,例如,随着日期的变化。在变量中捕获当前日期/时间,然后根据需要使用该值几乎总是一个更好的主意。这在存储过程中的多个语句中更为重要。多次使用GetDate最常见的原因是在捕获长时间运行的操作的开始和结束时间时。能否提供示例输入,即ATT数据和所需结果?@HABO谢谢。Michael在下面提供的Case语句是有效的,但我对其进行了修改,以应用您在这里讨论的内容,即我设置@Date=DATEADDday、DATEDIFFday、0、GETDATE、0,然后在实际查询的Where子句中使用和DT=@Date,这样它将只获得一次日期。您提供的Case语句有效。谢谢你的帮助。
Select SC, SN, DT, @Period as Period, ATT.A1
From ATT
Where
SC = '9'
and DT = DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
and case @period
when 'att.a1' then att.a1
when 'att.a2' then att.a2
when 'att.a3' then att.a3
when 'att.a4' then att.a4
when 'att.a5' then att.a5
when 'att.a6' then att.a6
when 'att.a7' then att.a7
end = 'T'
Declare @sql varchar(max)
Set @sql = '
Select SC, SN, DT, @Period as Period, ATT.A1
From ATT
Where SC = '9' and ' + @Period + ' = ''T''
and DT = DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)'
Exec(@sql)