2009-08-26 11 views
2

Ich bin in der unglücklichen Situation der Entwicklung einer App mit SQL Server 2005 in der Entwicklungsumgebung, aber SQL Server 2000 auf dem Produktionsserver. Ich habe eine ziemlich komplexe SELECT-Abfrage, die auf der Entwicklung/Test-Server funktioniert gut, aber fällt in der Produktionsumgebung über:Mehrere innere Joins in SQL 2000

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 

Können Sie etwas sehen, die einen Unterschied, wenn sie auf verschiedene Versionen von SQL Server ausgeführt machen sollten, oder in der Tat irgendwelche Möglichkeiten zur Vereinfachung der Abfrage in jedem Fall?

+0

Können Sie die Fehlermeldung, die Sie erhalten, posten? –

+0

sind die Datenbanken identisch mit denen der SQL-Versionen, auf denen sie ausgeführt werden? – Gavin

Antwort

0

Ok, das ist ein bisschen peinlich - es stellt sich heraus (wie Robin sagte), dass an der SQL selbst nichts falsch ist; Die Abfrage wird in einer ASPX-Anwendung ausgeführt und es stellt sich heraus, dass die Verbindungszeichenfolge in der Datei web.config falsch ist.

Aber danke für einige sehr gute Antworten - Robins Tipp auf die Kompatibilität der Ebene und Håkan Zeiger auf dreieckige Joins sind definitiv Dinge, die ich untersuchen werde.

1

Ich kann nichts sofort mit dem SQL falsch sehen. Wenn Sie jedoch die Fehler erhalten, die Ihnen zur Verfügung stehen, hilft dies.

Sind die Schemas/Tabellenstruktur auf beiden Servern identisch? Verwenden Sie z. B. NVARCHAR (MAX) auf SQL 2005-Computer und NTEXT auf SQL 2000? Dies würde Ihre GROUP BY daran hindern zu arbeiten.

Schließlich können Sie den Kompatibilitätsgrad der Datenbank in SQL 2005 ändern. Klicken Sie im Management Studio mit der rechten Maustaste auf die Datenbank und wählen Sie Eigenschaften. Wechseln Sie zur Seite Optionen und wählen Sie Kompatibilitätsgrad als SQL Server 2000 (80).

2

Dies ist nicht die Antwort auf Ihre Frage, aber eine wichtige Sache zu denken. Sie haben eine ziemlich komplexe Abfrage und es wird eine Menge Ressourcen verbrauchen. Der Optimierer in SQL Server 2000 kann aufgrund der Komplexität keinen optimierten Abfrageplan erstellen und verwendet wahrscheinlich Table Scans. Es wird nicht mehr empfohlen zu verwenden als 4 in SQL Server 2000 schließt sich

Ich schlage vor, Sie versuchen, die Erklärung zu unterteilen und temporäre Tabellen

Eine andere Sache zu denken verwenden, ist die Verwendung eines „Dreiecks join“

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

Das ist ein interessanter Artikel über Triangular joins

Grüße

Håkan Winther