3

我正在尝试从我们的出勤数据库(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)

当我使用它时,我没有得到任何结果。如果我@Period = 'T'从 Where 子句中删除,我会得到以下信息:

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  

我知道当我@PeriodSELECT语句和WHERE子句中使用时,它使用的是文字字符串值@Period,但我需要它使用@Periodas的值Table.Column

因此,在 9:00 它将选择 from ATT.A1, 10:00 from ATT.A2... 15:00 fromATT.A7并且每次比较 ATT.A# = 'T'

我希望这很清楚。

谢谢,安东尼

4

1 回答 1

2

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)
于 2012-08-24T18:18:04.117 回答