SQL - 在SELECT语句和WHERE子句中使用变量作为列

时间:2012-08-24 17:58:39

标签: sql-server sql-server-2008

我正试图从我们的考勤数据库(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的文字字符串值,但我需要它来使用该值@PeriodTable.Column

因此,在9:00,它将从ATT.A1中选择ATT.A2,从ATT.A7 ... 15:00从{{1}}中选择,并且每次比较是否ATT.A#=' T'

我希望这很清楚。

谢谢, 安东尼

1 个答案:

答案 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)