Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL - use variable as column in SELECT statement and WHERE clause

I'm trying to pull the students that are tardy for the previous period from our attendance database (SQL Server 2008). The period attendance is stored in ATT.A1, ATT.A2 ... ATT.A7. I want to schedule a job to run each hour, starting at 9am, and pull the tardy students, but I can't figure out the code.

Here's my code (pseudo-code):

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)

When I use this, I get no results. If I remove @Period = 'T' from the Where clause, I get the following:

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  

I know that when I use @Period in the SELECT statement and WHERE clause it's using the literal string value of @Period, but I need it to use the value of @Period as Table.Column.

So, at 9:00 it will select from ATT.A1, 10:00 from ATT.A2 ... 15:00 from ATT.A7 and each time compare whether ATT.A# = 'T'

I hope that's clear.

Thanks, Anthony

like image 387
Anthony Gattuso Avatar asked Jun 16 '26 19:06

Anthony Gattuso


1 Answers

Sql Server makes a distinction between a string containing a column name, and the column name itself, so you'll either need to use dynamic sql, or a case statement to translate the string to the actual column name as illustrated below:

Case Statement (I'd recommend this one):

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'

Dynamic 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)
like image 111
Michael Fredrickson Avatar answered Jun 18 '26 11:06

Michael Fredrickson



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!