J'essaie de créer une procédure stockée qui prend un paramètre de bit qui si la valeur est vraie par une colonne et si des commandes fausses par une autre colonne. Comment puis-je implémenter cela?
Voici ce que j'ai jusqu'à présent p>
7 Réponses :
Un moyen brut: Vous devriez également pouvoir utiliser cas ..Quand je pense: p>
Je ne suis pas vraiment sûr de pouvoir? Je finirais par faire ceci:
Vous pouvez le faire en utilisant une déclaration de cas dans l'ordre par, mais si la requête est suffisamment complexe, votre méthode sera plus rapide.
SELECT
acct_nbr,
acct_name
FROM
acct
ORDER BY case @switch when 1 then acct_name else acct_nbr end
Cela ne fonctionne que lorsque Acct_nbr et ACCT_NAME ont le même type de données ou sont convertis les uns sur les autres.
Vrai, mais c'est une technique utile.
Je pensais que vous pourriez changer le paramètre sur un int, et trier par la colonne avec cette ordinale: Cela jette une belle erreur (SQL2005): P> msg 1008, niveau 16, état 1, ligne 4
L'élément de sélection identifié par le
La commande par numéro 1 contient une variable
Dans le cadre de l'expression identifiant
une position de colonne. Les variables sont seulement
permis lors de la commande par une expression
Référencer un nom de colonne. P>
blockQuote> googling autour de "A href =" http://john-sheehan.com/blog/slightly-more-dynamic-server-by-in-sql-server-n-in-sql-server-ft-in-sql-server-2005/ "rel =" nofollow NOREFERRER "> Cette solution ici (SQL 2005 et UP): P>
CREATE PROCEDURE [dbo].[CLICK10_GetCP]
@switch AS BIT
AS
BEGIN
SELECT
acct_nbr,
acct_name
FROM
acct
ORDER BY CASE
WHEN @switch = 0 THEN (RANK() OVER (ORDER BY acct_nbr, acct_name))
WHEN @switch = 1 THEN (RANK() OVER (ORDER BY acct_name, acct_nbr))
END
GO
ORDER BY CASE WHEN @switch = 0 THEN Field1 END, CASE WHEN @Switch = 1 THEN Field2 END
Vous pouvez écrire ceci comme une expression de cas ... cas lorsque @ interrupteur = 0 puis champ1 lorsque vous @ interrupteur = 1 puis field2 fin
Si chaque cas a une seule clause, vous n'avez pas besoin de vous inquiéter de quel type les champs sont.
Je m'excuse, cela fonctionne en fait comme annoncé, donc +1. Ceci (commander par cas @switch quand 1 puis field1 autre champ2 fin;) ne le fait pas.
L'approche la plus succincte est la suivante:
CREATE PROCEDURE [dbo].[CLICK10_GetCP]
@switch AS BIT
AS
BEGIN
SELECT
acct_nbr,
acct_name
FROM
acct
ORDER BY
case @switch
when 1 then acct_nbr
when 0 then acct_name
end
END
GO
Un moyen est de construire la requête quelque chose comme ceci: