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
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):
Dynamic Sql: