2

我不幸在开发环境中使用 SQL Server 2005 开发应用程序,但在生产服务器上使用 SQL Server 2000。我有一个相当复杂的 SELECT 查询,它在开发/测试服务器上运行良好,但在生产环境中失败:

SELECT tbl_questions.Question, tbl_questions.QuestionCode 
FROM tbl_questions INNER JOIN (
    SELECT sg.questioncode, sg.gradeB, sg.gradeA, t2.wt 
    FROM tbl_scoregrade AS sg INNER JOIN (
        SELECT t1.QuestionCode, AVG(1.0 * aw.Weight) AS wt 
        FROM tbl_AnswerWeight AS aw INNER JOIN (
            SELECT assa.QuestionCode, assa.Answer 
            FROM tbl_AllStaffSurveyAnswers AS assa INNER JOIN 
            tbl_AllStaffSurvey AS ass ON assa.Questionguid = ass.Questionguid 
            WHERE (ass.Trust = 'RD7') AND (ass.Specialty = '97'))
        AS t1 ON aw.questioncode = t1.QuestionCode AND aw.Response = t1.Answer 
        GROUP BY t1.QuestionCode )
    AS t2 ON sg.questioncode = t2.QuestionCode AND sg.gradeA > t2.wt)
AS t3 ON tbl_questions.QuestionCode = t3.questioncode

你能看到在不同版本的 SQL Server 上运行时应该有所不同的任何东西,或者在任何情况下都可以简化查询的任何方法吗?

4

3 回答 3

2

这不是您问题的答案,而是要考虑的重要事项。您有一个相当复杂的查询,它将消耗大量资源。由于复杂性,SQL Server 2000 中的优化器将无法创建优化的查询计划,并且可能会使用表扫描。不建议在 SQL Server 2000 中使用超过 4 个连接。

我建议你尝试分割语句并使用临时表

要考虑的另一件事是使用“三角形连接”

ON sg.questioncode = t2.QuestionCode AND sg.gradeA > t2.wt

这是一篇关于三角连接的有趣文章

问候

哈坎·温瑟

于 2009-08-26T10:44:37.747 回答
1

我看不出 SQL 有什么问题。但是,如果您遇到错误,那将有所帮助。

两台服务器上的模式/表结构是否相同?例如,您是否在 SQL 2005 机器上使用 NVARCHAR(MAX) 而在 SQL 2000 上使用 NTEXT?这将阻止您的 GROUP BY 工作。

最后,您可以在SQL 2005上更改数据库的兼容级别。在管理工作室中,右键单击数据库,选择,属性。转到选项页面并选择兼容性级别作为 SQL Server 2000 (80)。

于 2009-08-26T10:19:52.023 回答
0

好吧,这有点尴尬——事实证明(正如 Robin 所说)SQL 本身没有任何问题;该查询在 ASPX 应用程序中运行,结果表明 web.config 文件中的连接字符串错误。

但是感谢一些非常好的答案 - Robin 关于更改兼容性级别的提示和 Håkan 指向三角形连接的指针绝对是我要研究的事情。

于 2009-08-26T11:29:47.343 回答