3

前の期間に遅刻した学生を出席データベース (SQL Server 2008) から取得しようとしています。期間出勤は に保存されATT.A1, ATT.A2 ... ATT.A7ます。午前 9 時から 1 時間ごとに実行するジョブをスケジュールし、遅刻した生徒を引き取りたいのですが、コードがわかりません。

これが私のコードです(疑似コード):

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  

ステートメントと句で使用する場合、 のリテラル文字列値を使用@Periodしていることはわかっていますが、 asの値を使用するにはそれが必要です。SELECTWHERE@Period@PeriodTable.Column

したがって、9 :00 からATT.A1、10:00 からATT.A2... 15:00 から選択し、ATT.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 に答える