ASP Classic中查询数据库最近一周数据的SQL语句运行异常问题
问题原因
- QUOTED_IDENTIFIER配置差异:SQL Server 会话开启
QUOTED_IDENTIFIER选项时,双引号包裹的内容会被识别为数据库对象(列、表等)而非字符串常量。你代码中DATEADD("d", -7, ...)里的"d"在ASP建立的数据库会话中会被解析为列名d,触发不存在该列的报错。而SSMS的会话默认可能关闭了该选项,因此可以正常执行。 - 语法不规范:DATEADD函数的时间单位参数本身不需要用引号包裹,加引号属于非标准写法,强依赖数据库配置才能运行。
修复方案
直接去掉DATEADD参数中d的双引号即可,修改后的代码如下:
query = 'SELECT DateAndTime, X, Y, Z FROM '+ Request.QueryString("table") + ' where DateAndTime between DATEADD(d,-7,(select MAX(DateAndTime) from '+ Request.QueryString("table") + ')) and (select MAX(DateAndTime) from '+ Request.QueryString("table") + ') order by DateAndTime';
如果需要优化查询性能,可以减少一次MAX查询的表扫描,改写为如下写法:
query = 'WITH get_max AS (SELECT MAX(DateAndTime) AS latest_time FROM ' + Request.QueryString("table") + ') SELECT t.DateAndTime, t.X, t.Y, t.Z FROM ' + Request.QueryString("table") + ' t, get_max WHERE t.DateAndTime BETWEEN DATEADD(d, -7, get_max.latest_time) AND get_max.latest_time ORDER BY t.DateAndTime';
安全提示
当前代码直接拼接用户传入的Request.QueryString("table")、Request("from")等参数,存在严重SQL注入风险,建议对传入的表名做白名单校验,查询条件使用参数化查询传递,避免被恶意攻击。
内容的提问来源于stack exchange,提问作者alexander rog
相关产品推荐
相关产品推荐

