2012-08-24 44 views
2

我試圖從我們的考勤數據庫(SQL Server 2008)中爲上一段時間拖延的學生提供幫助。考勤期存儲在ATT.A1, ATT.A2 ... ATT.A7。我想安排一份工作,從早上9點開始每個小時運行一次,然後拖延遲到的學生,但我無法弄清代碼。SQL - 在SELECT語句和WHERE子句中使用變量作爲列

這裏是我的代碼(僞代碼):

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 

我知道,當我在使用@PeriodSELECT聲明和WHERE條款它使用的@Period的字符串值,但我需要它使用@Period的值爲Table.Column

因此,在9:00它將從ATT.A1,從上午10點選擇ATT.A2 ... 15:00從ATT.A7每一次比較是否ATT.A#= 'T'

我希望是十分明顯的。

感謝, 安東尼

+0

使用'GETDATE()'在查詢中被追逐的目標,影響性能,並且可能產生好奇的結果,例如隨着日期的變化。在變量中捕獲當前日期/時間幾乎總是一個更好的主意,然後根據需要使用該值。在存儲過程中,這在多個語句中更重要。多次使用'GetDate()'的最常見原因是捕獲長時間運行操作的開始和結束時間。 – HABO

+0

您能否提供樣本輸入,即「ATT」數據和期望的結果? – HABO

+0

@HABO謝謝。邁克爾在下面提供的案例陳述的作品,但我改變它適用於你在這裏談論的,即我'設置@日期= DATEADD(日,DATEDIFF(天,0,GETDATE()),0)',然後使用'並在實際查詢的Where子句中使用DT = @ Date',這樣它只會'GETDATE()'一次。 –

回答

1

Sql Server中含有使列名的字符串,列名本身區別開來,所以你要麼需要使用動態SQL或case語句的字符串翻譯在實際的列名,如下圖所示:

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) 
+0

您提供的個案陳述工作。感謝您的幫助。 –