从MSSQL中的日期字段中选择不同的年份

时间:2012-09-11 16:13:44

标签: sql-server tsql asp-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

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

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

1 个答案:

答案 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相对)可能有所帮助。

看到这方面的执行计划会很有意思(即确保没有触发因素减缓)