Impossible de order par alias dans SQL Server 2012

J'utilise SQL Server 2012 , version 11.0.3000.0 .

J'ai une requête comme celle-ci:

 SELECT BAUSER.USER_FNM + ' ' + BAUSER.USER_LNM AS USER_FULL_NAME FROM CAORAC CAORAC INNER JOIN CAACCO CAACCO ON CAORAC.ACCO_KEY = CAACCO.ACCO_KEY INNER JOIN BAUSER BAUSER ON CAORAC.USER_KEY = BAUSER.USER_KEY ORDER BY CASE WHEN @cOrderBy = 'cUSER_FULL_NAME ASC' THEN USER_FULL_NAME END ASC, CASE WHEN @cOrderBy = 'cUSER_FULL_NAME DESC' THEN USER_FULL_NAME END DESC 

Une erreur est en train de se produire:

 Msg 207, Level 16, State 1, Line 21 Invalid column name 'USER_FULL_NAME'. 

Pourquoi je ne peux pas order par USER_FULL_NAME? Je sais que l'ordre par alias est possible, pourquoi n'est pas possible dans ce cas dans cette colonne particulière?

Oui, vous pouvez l'utiliser dans l'ordre par, mais non dans l'instruction .

 CREATE VIEW NAME AS SELECT BAUSER.USER_FNM + ' ' + BAUSER.USER_LNM AS USER_FULL_NAME --, next cols FROM CAORAC CAORAC INNER JOIN CAACCO CAACCO ON CAORAC.ACCO_KEY = CAACCO.ACCO_KEY INNER JOIN BAUSER BAUSER ON CAORAC.USER_KEY = BAUSER.USER_KEY SELECT USER_FULL_NAME AS USER_FULL_NAME, CASE WHEN @cOrderBy = 'cUSER_FULL_NAME ASC' THEN USER_FULL_NAME END USER_FULL_NAME_ASC , CASE WHEN @cOrderBy = 'cUSER_FULL_NAME DESC' THEN USER_FULL_NAME END USER_FULL_NAME_DESC FROM NAME ORDER USER_FULL_NAME_ASC ASC, USER_FULL_NAME_DESC DESC 

Ou vous pouvez append un cas dans votre vue aussi. Cela dépend de puropse mais il pourrait être candidat à la fonction de valeur de table. Ou si vous préférez qry plus complexe, vous pouvez utiliser la table dérivée (au lieu de la vue).

Je suppose que cela devrait fonctionner

  SELECT BAUSER.USER_FNM + ' ' + BAUSER.USER_LNM AS USER_FULL_NAME FROM CAORAC CAORAC INNER JOIN CAACCO CAACCO ON CAORAC.ACCO_KEY = CAACCO.ACCO_KEY INNER JOIN BAUSER BAUSER ON CAORAC.USER_KEY = BAUSER.USER_KEY ORDER BY CASE WHEN @cOrderBy = 'cUSER_FULL_NAME ASC' THEN BAUSER.USER_FNM + ' ' + BAUSER.USER_LNMEND ASC, CASE WHEN @cOrderBy = 'cUSER_FULL_NAME DESC' THEN BAUSER.USER_FNM + ' ' + BAUSER.USER_LNMEND DESC 

Essaye ça

 ;WITH cte as ( SELECT BAUSER.USER_FNM + ' ' + BAUSER.USER_LNM AS USER_FULL_NAME FROM CAORAC CAORAC INNER JOIN CAACCO CAACCO ON CAORAC.ACCO_KEY = CAACCO.ACCO_KEY INNER JOIN BAUSER BAUSER ON CAORAC.USER_KEY = BAUSER.USER_KEY ) SELECT * FROM cte ORDER BY CASE WHEN @cOrderBy = 'cUSER_FULL_NAME ASC' THEN USER_FULL_NAME END ASC, CASE WHEN @cOrderBy = 'cUSER_FULL_NAME DESC' THEN USER_FULL_NAME END DESC 

METTRE À JOUR
Si vous avez la grande quantité de données alors allez à la vue autre chose CTE est suffisant.

Reportez-vous à: https://stackoverflow.com/a/30919028/6224406

Remarque: Il n'y a pas de différence entre un CTE et une vue sauf si la vue est indexée