我正在对旧的经典ASP网站进行一些更新。有一个表包含几列文本数据和一个日期时间字段。我需要从表中的所有值中获取唯一年份的列表。我试过这个:
set objConnection = Server.CreateObject("ADODB.Connection")
objConnection.ConnectionString = "Provider=SQLNCLI10;Server=localhost;Database=mydb;Uid=myuser;Pwd=something;"
objConnection.Open
set objRst = objConnection.execute("SELECT DISTINCT(YEAR(report_date)) AS report_year FROM report;")
if not objRst.eof then
do while not objRst.eof
response.write objRst("report_year")
objRst.movenext
loop
end if
但是当我在页面中运行这个脚本时它什么也没做 - 最终脚本超时了。
有谁能建议如何做到这一点?谢谢!
答案 0 :(得分:0)
这将是一个索引问题或锁定问题(或两者兼而有之。)。
首先,尝试使用NOLOCK提示选择数据 - 这意味着您的选择查询不会等待任何未提交的事务:
set objRst = objConnection.execute("SELECT YEAR(report_date) AS report_year FROM report (NOLOCK) GROUP BY YEAR(report_date)")
do while not objRst.eof
response.write objRst("report_year")
objRst.movenext
loop
如果仍然挂起,则表明存在索引问题,要对其进行排序,您需要在SSMS中运行查询(如果可以),并查看它需要多长时间。如果在SSMS中需要很长时间,那么建议您需要在report_date列上创建一个索引 - 如果它在SSMS中快速,那么它与您的ASP有关,即连接是否打开?你试过一个简单的查询来确保它有效吗?即。
SELECT TOP 1 YEAR(report_date)
FROM report
编辑:刚刚注意到您对表中只有5行的评论 - 所以它可能不是索引问题!但是,NOLOCK
提示和GROUP BY
(与DISTINCT
相对)可能有所帮助。
看到这方面的执行计划会很有意思(即确保没有触发因素减缓)