Case-Anweisung in SQL ROW_NUMBER () Order By-Klausel nicht funktioniert auf varchar und int-Werte

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

Frage

Warum funktioniert das nicht?

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

Aber wenn man die ShipNo zu einem varchar in der Case-Anweisung werfen funktioniert es?

War es hilfreich?

Lösung

Ich bin mir bewusst, dass diese alte Post, aber das ist für jeden, der auf dieses Problem taumelt und ist auf der Suche nach einer Lösung:

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

im Grunde sind Sie setzen jedes Feld in seinem eigenen Fall. Tun Sie dies nur, wenn ihr Datentyp oder Wert innerhalb Feldes unterscheidet sich sowohl für die Spalten oder wenn Sie werden immer Fehler wie

Konvertierung fehlgeschlagen, wenn int varchar oder varchar zu konvertieren versuchen .. int

Andere Tipps

Von Books Online:

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

„Die Datentypen von else_result_expression und jeder result_expression müssen gleich sein oder muss eine implizite Konvertierung sein.“

So Lieferant und ShipNo müssen die gleichen Datentyp sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top