0

我正在对旧的 Classic 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

但是当我在页面中运行这个脚本时,它什么也不做——最终脚本超时。

谁能建议如何做到这一点?谢谢!

4

1 回答 1

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 有关,即连接是否打开?你试过做一个简单的查询来确保它有效吗?IE

SELECT TOP 1 YEAR(report_date) 
FROM report

编辑:刚刚注意到您对表中只有 5 行这一事实的评论 - 所以这可能不是索引问题!然而,NOLOCK提示和GROUP BY(相对于DISTINCT)可能会有所帮助。

看到这个的执行计划也会很有趣(即确保没有触发器减慢速度)

于 2012-09-11T16:27:24.850 回答