gpt4 book ai didi

sql-server - SQL - 在 SELECT 语句和 WHERE 子句中使用变量作为列

转载 作者:行者123 更新时间:2023-12-03 16:45:56 25 4
gpt4 key购买 nike

我正在尝试从我们的出勤数据库 (SQL Server 2008) 中提取上一节课迟到的学生。期间出勤存储在 ATT.A1、ATT.A2 ... ATT.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 中选择 ... 15:00 从 ATT 中选择。 A7 每次比较是否ATT.A# = 'T'

我希望这很清楚。

谢谢,安东尼

最佳答案

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)

关于sql-server - SQL - 在 SELECT 语句和 WHERE 子句中使用变量作为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12114425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com