Comment utiliser Order By dans une procédure stockée sans l'aide de SQL dynamique
J'ai de la suite MS SQL procédure stockée. J'ai besoin de trier les résultats sans l'aide de SQL dynamique et sp_executesql
méthode
@Order by peut avoir les valeurs possibles ProductName ASC
, ProductName DESC
, ProductCode ASC
, VendorName DESC
, VendorCode
ou ClientName
J'ai essayé d'utiliser ORDER BY CASE
, est-il un problème si le ProductName
, ProductCode
sont de type différent?
ALTER PROCEDURE [dbo].[SortedReport]
(
@ClientID INT,
@RecordLimit,
@FromDate DATETIME,
@ToDate DATETIME,
@OrderBy NVARCHAR(MAX)
)
AS
BEGIN
IF (@OrderBy IS NULL) BEGIN
SET @OrderBy = 'ProductName';
END
SELECT TOP (@RecordLimit)
sv.ClientID,
sv.VendorID,
sv.ProductID,
sv.TransactionTime,
sv.ClientName,
sv.VendorName,
sv.ProductName,
sv.ProductCode,
sv.VendorCode,
FROM SortedReportiew AS sv
WHERE (sv.ClientID = @ClientID)
AND (sv.TransactionTime >= @FromDate)
AND (sv.TransactionTime < @Date)
Mise à jour:
Est le ci-dessous une partie correcte? ref de ici
ORDER BY
CASE @OrderBy WHEN 'ProductCode ASC' THEN ProductCode WHEN 'ProductCode DESC' THEN ProductCode END DESC,
CASE @OrderBy WHEN 'ProductName ASC' THEN ProductName WHEN 'ProductName DESC' THEN ProductName END DESC,
Pourquoi ne pas le SQL dynamique? C'est beaucoup plus rapide que n'importe quel de la statique des solutions pour ce genre de problème.
Pourquoi voulez-vous éviter de SQL dynamique pour exécuter une instruction dynamique?
Winand , tout simplement parce que le client voulez convertir ces dynamiques SQL statique
Donc, demander au client pourquoi le faire 😉 Il y a le "le SQL dynamique est lente mythe" qui conduit à de nombreuses reprises pour les demandes de ce genre. Cependant, le fait correctement dynamique-sql (en utilisant bind-paramétrée) est généralement meilleure.
se débarrasser de sql dynamique pour le "order by" entraîne une amélioration des performances à travers ces ordre par les requêtes.
Pourquoi voulez-vous éviter de SQL dynamique pour exécuter une instruction dynamique?
Winand , tout simplement parce que le client voulez convertir ces dynamiques SQL statique
Donc, demander au client pourquoi le faire 😉 Il y a le "le SQL dynamique est lente mythe" qui conduit à de nombreuses reprises pour les demandes de ce genre. Cependant, le fait correctement dynamique-sql (en utilisant bind-paramétrée) est généralement meilleure.
se débarrasser de sql dynamique pour le "order by" entraîne une amélioration des performances à travers ces ordre par les requêtes.
OriginalL'auteur Mithun Sreedharan | 2011-05-17
Vous devez vous connecter pour publier un commentaire.
Comme vous l'avez déjà dit: l'Utilisation
ORDER BY CASE
, mais plusieurs fois afin d'éviter les problèmes liés aux différents types de colonnes:EDIT:
Mise à jour de la requête à l'ajustement de la mise à jour de votre question. Je suppose que vous vouliez dire
ProductCode ASC
etProductCode DESC
?ProductName ASC
ASC/DESC est facultatif, avec ASC étant la valeur par défaut: msdn.microsoft.com/en-us/library/ms188385.aspx
OriginalL'auteur Ocaso Protal
Je comprends, la commande utilise une seule colonne. Dans ce cas, je pourrais essayer quelque chose comme ceci:
Split
@OrderBy
en@OrderByCol
et@OrderByDir
.L'utilisation de ce modèle:
Ou, si vous utilisez SQL Server 2005+, peut-être une, comme une alternative:
@Greg Ogle a correctement souligné dans le commentaire, le premier modèle ne peut fonctionner que lorsque les différents critères de tri sont de types compatibles, sinon l'instruction break.
Merci, j'ai ajouté la remarque à ma réponse (je ne sais pas pourquoi je n'ai pas réussi à le faire lorsque j'ai été poster la réponse).
OriginalL'auteur Andriy M