Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL-在SELECT语句和WHERE子句中将变量用作列_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server SQL-在SELECT语句和WHERE子句中将变量用作列

Sql server SQL-在SELECT语句和WHERE子句中将变量用作列,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正试图从我们的考勤数据库SQLServer2008中提取上一节课迟到的学生。考勤期间存储在附件A1、附件A2。。。附件A7。我想安排一个作业,从早上9点开始,每小时运行一次,然后拉那些迟到的学生,但我想不出代码 以下是我的代码伪代码: Declare @Period varchar(6) Set @Period = 'att.a' + Cast((DATENAME(hour, GETDATE()) - 8) as varchar(1)) Select SC, SN, DT, @Period

我正试图从我们的考勤数据库SQLServer2008中提取上一节课迟到的学生。考勤期间存储在附件A1、附件A2。。。附件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  
我知道当我在SELECT语句和WHERE子句中使用@Period时,它使用的是@Period的文本字符串值,但我需要它将@Period的值用作Table.Column

所以,在9:00它将从ATT.A1中选择,10:00从ATT.A2中选择。。。从ATT.A7开始15:00,每次比较ATT.A是否为'T'

我希望这是清楚的

谢谢,
Anthony

Sql Server区分了包含列名的字符串和列名本身,因此您需要使用动态Sql或case语句将字符串转换为实际列名,如下所示:

案例陈述我推荐这个:

动态Sql:


在查询中使用GetDate是在追逐移动目标,影响性能,并可能产生奇怪的结果,例如,随着日期的变化。在变量中捕获当前日期/时间,然后根据需要使用该值几乎总是一个更好的主意。这在存储过程中的多个语句中更为重要。多次使用GetDate最常见的原因是在捕获长时间运行的操作的开始和结束时间时。能否提供示例输入,即ATT数据和所需结果?@HABO谢谢。Michael在下面提供的Case语句是有效的,但我对其进行了修改,以应用您在这里讨论的内容,即我设置@Date=DATEADDday、DATEDIFFday、0、GETDATE、0,然后在实际查询的Where子句中使用和DT=@Date,这样它将只获得一次日期。您提供的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'
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)