Instruction Case en SQL Row_number () La clause Order By ne fonctionne pas sur les valeurs varchar et int

StackOverflow https://stackoverflow.com/questions/268322

Question

Pourquoi cela ne fonctionne-t-il pas?

DECLARE @temp table
(ShipNo int,
 Supplier varchar(10)
)

INSERT INTO @temp VALUES (1,'CFA')
INSERT INTO @temp VALUES (1, 'TFA')
INSERT INTO @temp VALUES (2, 'LRA')
INSERT INTO @temp VALUES (2, 'LRB')
INSERT INTO @temp VALUES (3, 'ABC')
INSERT INTO @temp VALUES (4, 'TFA')

Declare @OrderBy varchar(255)
sET @OrderBy = 'Supplier'



SELECT ROW_NUMBER() OVER (ORDER BY 
CASE @OrderBy
 WHEN 'Supplier' THEN Supplier
 WHEN 'ShipNo' THEN ShipNo
END
) AS RowNo,
ShipNo,
Supplier
FROM @temp

Mais si vous transmettez le ShipNo à un varchar dans l'instruction Case, cela fonctionne-t-il?

Était-ce utile?

La solution

Je suis conscient du fait qu'il s'agit d'un ancien message, mais qu'il s'adresse à quiconque tombe sur cette question et cherche une solution:

SELECT ROW_NUMBER() OVER (ORDER BY  
CASE @OrderBy 
 WHEN 'Supplier' THEN Supplier
END
CASE @OrderBy
 WHEN 'ShipNo' THEN ShipNo 
END 
)

fondamentalement, vous mettez chaque champ dans son propre cas. Ne le faites que lorsque leur type de données ou leur valeur à l'intérieur du champ diffère pour les deux colonnes ou lorsque vous obtenez une erreur telle que

la conversion a échoué lors de la tentative de conversion de int en varchar ou de varchar en int.

Autres conseils

Dans la documentation en ligne:

CASE
WHEN Boolean_expression THEN result_expression 
    [ ...n ] 
[ 
    ELSE else_result_expression 
] 
END

"Les types de données de else_result_expression et de toute expression de resultat doivent être identiques ou doivent correspondre à une conversion implicite."

So Supplier et ShipNo doivent être du même type de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top