如何从所有DateTime字段中获取所有值,而无需对字段名称进行硬编码?

时间:2014-05-22 20:12:18

标签: sql-server datetime

我有一个表tabEvent,有11个字段是DateTime。我想查询tabEvent中的每个DateTime字段,如果有任何值是> ' 4/1/2014年'和< dateDate(),然后返回该行。

但我不想对字段名称进行硬编码,因为它们总是在变化(网站不断增长和变形)。

我有下面的代码片段,它返回字段名称,但不是表格上的查询(还)。

select c.name ColumnName
from sys.columns c
join sys.types t on (c.user_type_id = t.user_type_id)
where object_name(c.OBJECT_ID) = 'tabEvent'
  and t.name = 'datetime'
order by c.OBJECT_ID

英语翻译:我试图对proc进行编码,每当我登录管理页面时,检查tabEvent表中是否已经过去的任何关键日期(自上次通知以来)并发送消息给我,管理员。然后它会将通知日期值更新为今天,以便下次运行proc。

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用动态SQL实现此目的:

DECLARE @Startdate VARCHAR(10)= '2014-04-01' 
DECLARE @EndDate VARCHAR(10) = convert(VARCHAR(10),GETDATE(),20)

DECLARE @sql nVARCHAR(max)

DECLARE @where nVARCHAR(max)
SELECT @where = ' WHERE ' +  STUFF((select c.name  + ' BETWEEN ''' + @StartDate + ''' AND ''' + @EndDate + ''' AND '
from sys.columns c
join sys.types t on (c.user_type_id = t.user_type_id)
where object_name(c.OBJECT_ID) = 'tabEvent'
  and t.name = 'datetime'
order by c.OBJECT_ID
FOR XML PATH('')),1,0,'')

SELECT @sql =   'SELECT * FROM tabEvent' + LEFT(@where,LEN(@where)-4)

EXECUTE sp_executesql @sql