2009-08-26 8 views
2

Je suis dans la situation malheureuse de développer une application utilisant SQL Server 2005 dans l'environnement de développement mais SQL Server 2000 sur le serveur de production. J'ai une requête SELECT assez complexe qui fonctionne très bien sur le développement/serveur de test, mais tombe dans l'environnement de production:Plusieurs jointures internes dans 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 

Vous voyez quelque chose qui devrait faire une différence lorsqu'il est exécuté sur différentes versions du serveur SQL, ou en effet des moyens de simplifier la requête dans tous les cas?

+0

Pouvez-vous poster le message d'erreur que vous obtenez? –

+0

sont les bases de données identiques autres que les versions de SQL, ils sont en cours d'exécution? – Gavin

Répondre

0

Ok, c'est un peu embarrassant - il se trouve (comme Robin l'a dit) qu'il n'y a rien de mal avec le SQL lui-même; la requête est exécutée dans une application ASPX et il s'avère que la chaîne de connexion dans le fichier web.config était erronée.

Mais merci pour quelques très bonnes réponses - le conseil de Robin sur le changement du niveau de compatibilité et le pointeur de Håkan sur les jointures triangulaires sont certainement des choses que je vais examiner.

1

Je ne peux pas voir quelque chose qui cloche immédiatement avec le SQL. Cependant, si vous avez les erreurs que vous recevez, cela vous aidera.

Les schémas/structure de table sont-ils identiques sur les deux serveurs? par exemple, utilisez-vous NVARCHAR (MAX) sur la machine SQL 2005 mais NTEXT sur SQL 2000? Cela empêchera votre GROUP BY de fonctionner.

Enfin, vous pouvez modifier le niveau de compatibilité de la base de données sur SQL 2005. Dans le studio de gestion, cliquez avec le bouton droit sur la base de données, choisissez, propriétés. Accédez à la page Options et sélectionnez le niveau de compatibilité en tant que SQL Server 2000 (80).

2

Ce n'est pas la réponse à votre question, mais une chose importante à penser. Vous avez une requête assez complexe et elle va consommer beaucoup de ressources. L'Optimiseur dans SQL Server 2000 ne sera pas en mesure de créer un plan de requête optimisé en raison de la complexité et utilisera probablement des analyses de table. Il est recommandé de ne pas utiliser plus de 4 Assemble dans SQL Server 2000.

Je vous suggère d'essayer de diviser la déclaration et utiliser des tables temporaires

Une autre chose à penser est l'utilisation d'une « triangulaire join »

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

Ceci est un article intéressant sur Triangular joins

Cordialement

Håkan Winther

Questions connexes