Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème éxécution vue dans SQL 2005 ...

4 réponses
Avatar
Christophe Cordonnier
Dans l'analyseur de requête de SQL 2005 j'exécute la requête suivante :

SELECT TOP 100 PERCENT
dbo.Forums.ForumID,
dbo.Categories.CategoryID,
dbo.Categories.CategoryName,
dbo.Forums.Title,
FROM dbo.Forums RIGHT OUTER JOIN dbo.Categories ON dbo.Forums.CategoryID =
dbo.Categories.CategoryID
GROUP BY dbo.Forums.ForumID,
dbo.Forums.Title,
dbo.Categories.CategoryID,
dbo.Categories.CategoryName,
ORDER BY dbo.Categories.CategoryName,
dbo.Forums.Title

Le problème est que quand je met la même requête dans une vue les données ne
sont pas classées pareils ! Une requête qui fonctionne par ailleurs
parfaitement bien avec SQL 2000 !

Une idée ?

Merci d'avance pour votre aide ...

--
Christophe - MVP Windows Mobile
http://www.windows-mobile.info/

4 réponses

Avatar
Patrice
Pourquoi 100 % ?

D'après la doc :

"La clause ORDER BY n'est pas valide dans les vues, les fonctions Inline,
les tables dérivées et les sous-requêtes, sauf si TOP est également
spécifié."

J'ai l'impression que tu utilises une "astuce" pour trier des vues mais que
SQL Server se rend compte que le TOP 100/ORDER BY ne "sert à rien"...

Quelqu'un plus au fait du fonctionnement interne pourra peut-être confirmer
(ou non) ? Peut-être aussi voir le plan d'éxécution et comparer avec ce qui
se passe lorsque tu mets 80 PERCENT par exemple...

--
Patrice

"Christophe Cordonnier" a
écrit dans le message de
news:
Dans l'analyseur de requête de SQL 2005 j'exécute la requête suivante :

SELECT TOP 100 PERCENT
dbo.Forums.ForumID,
dbo.Categories.CategoryID,
dbo.Categories.CategoryName,
dbo.Forums.Title,
FROM dbo.Forums RIGHT OUTER JOIN dbo.Categories ON dbo.Forums.CategoryID > dbo.Categories.CategoryID
GROUP BY dbo.Forums.ForumID,
dbo.Forums.Title,
dbo.Categories.CategoryID,
dbo.Categories.CategoryName,
ORDER BY dbo.Categories.CategoryName,
dbo.Forums.Title

Le problème est que quand je met la même requête dans une vue les données


ne
sont pas classées pareils ! Une requête qui fonctionne par ailleurs
parfaitement bien avec SQL 2000 !

Une idée ?

Merci d'avance pour votre aide ...

--
Christophe - MVP Windows Mobile
http://www.windows-mobile.info/


Avatar
Fred BROUARD
Bonjour,

Christophe Cordonnier a écrit:
Dans l'analyseur de requête de SQL 2005 j'exécute la requête suivante :

SELECT TOP 100 PERCENT
dbo.Forums.ForumID,
dbo.Categories.CategoryID,
dbo.Categories.CategoryName,
dbo.Forums.Title,
FROM dbo.Forums RIGHT OUTER JOIN dbo.Categories ON dbo.Forums.CategoryID =
dbo.Categories.CategoryID
GROUP BY dbo.Forums.ForumID,
dbo.Forums.Title,
dbo.Categories.CategoryID,
dbo.Categories.CategoryName,
ORDER BY dbo.Categories.CategoryName,
dbo.Forums.Title

Le problème est que quand je met la même requête dans une vue les données ne
sont pas classées pareils ! Une requête qui fonctionne par ailleurs
parfaitement bien avec SQL 2000 !

Une idée ?




1) le langage SQL ne supporte pas les cluase ORDER BY dans les vues. Le truc
utilisé par MS SQL Server pour faire plaisir à certains peut se reourner contre
eux. Une clause ORDER BY doit s'effectuer en final.
C'est d'ailleurs une grande hérésie que de créer des vues avec un ordre BY car
cela relentie considérabelement les perfs et ne permetra pas de définir un autre
ordre...

2) la collation par défaut de l'installation avec SQL Server 2000 et 2005 est
différente. Avez vous pensez à l'installer en correspondance ?

3) pour obtenir toutes les lignes il aurait fallu mettre
SELECT TOP 100 PERCENT WITH TIES

A +


Merci d'avance pour votre aide ...




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Med Bouchenafa
SQL Server ne garantit l'ordre des données que s'il existe explicitement une
clause ORDER BY dans l'instruction SELECT
Même s'il existe un ORDER BY dans la construction interne de la vue, il faut
absolument que tu rajoutes un ORDER BY comme ceci
SELECT * FROM NomVue ORDER BY CategoryName, Title

Sans une clause ORDER BY explicite, les résultats peuvent être différents de
ceux obtenus avec une version antérieure de SQL Server.

--
Bien cordialement
Med Bouchenafa



"Christophe Cordonnier" a
écrit dans le message de news:

Dans l'analyseur de requête de SQL 2005 j'exécute la requête suivante :

SELECT TOP 100 PERCENT
dbo.Forums.ForumID,
dbo.Categories.CategoryID,
dbo.Categories.CategoryName,
dbo.Forums.Title,
FROM dbo.Forums RIGHT OUTER JOIN dbo.Categories ON dbo.Forums.CategoryID > dbo.Categories.CategoryID
GROUP BY dbo.Forums.ForumID,
dbo.Forums.Title,
dbo.Categories.CategoryID,
dbo.Categories.CategoryName,
ORDER BY dbo.Categories.CategoryName,
dbo.Forums.Title

Le problème est que quand je met la même requête dans une vue les données
ne
sont pas classées pareils ! Une requête qui fonctionne par ailleurs
parfaitement bien avec SQL 2000 !

Une idée ?

Merci d'avance pour votre aide ...

--
Christophe - MVP Windows Mobile
http://www.windows-mobile.info/


Avatar
Christophe Cordonnier
Etant un grand garçon qui ne se laisse pas abattre j'en suis arrrivé à la
même conclusion :) J'ai viré le ORDER BY de la vue (Base qui n'a pas été
créée par mes soins), et j'ai rajouté ce ORDER BY dans la procédure stockée
appelant la vue et là plus de problème.

Merci beacoup pour la réponse car au moins elle confirme mon axe de
recherche :)

--
Christophe - MVP Windows Mobile
http://www.windows-mobile.info/


"Med Bouchenafa" a écrit :
SQL Server ne garantit l'ordre des données que s'il existe explicitement une
clause ORDER BY dans l'instruction SELECT
Même s'il existe un ORDER BY dans la construction interne de la vue, il faut
absolument que tu rajoutes un ORDER BY comme ceci
SELECT * FROM NomVue ORDER BY CategoryName, Title
Sans une clause ORDER BY explicite, les résultats peuvent être différents de
ceux obtenus avec une version antérieure de SQL Server.
--
Bien cordialement
Med Bouchenafa