我正试图从我们的考勤数据库(SQL Server 2008)中拉出上一期间迟到的学生。期间出勤存储在ATT.A1, ATT.A2 ... ATT.A7
。我想安排一个工作每小时运行一次,从上午9点开始,然后拉扯迟到的学生,但我无法弄清楚代码。
这是我的代码(伪代码):
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
我知道当我在@Period
语句和SELECT
子句中使用WHERE
时,它使用的是@Period
的文字字符串值,但我需要它来使用该值@Period
为Table.Column
。
因此,在9:00,它将从ATT.A1
中选择ATT.A2
,从ATT.A7
... 15:00从{{1}}中选择,并且每次比较是否ATT.A#=' T'
我希望这很清楚。
谢谢, 安东尼
答案 0 :(得分:1)
Sql Server区分包含列名的字符串和列名本身,因此您需要使用动态sql或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'
动态Sql:
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)