2012-04-12 3 views
3

Ich habe eine SQL-Anweisung in meinem C# Programm, das wie folgt aussieht:ORDER BY gibt falsche Reihenfolge

SELECT * FROM XXX.dbo.XXX 
WHERE Source = 'OH' 
    AND partnum = '1231202085' 
ORDER BY partnum, Packaging, Quantity 

Wenn diese Abfrage in SQL Server Management ausgeführt wird, werden die Ergebnisse als erwartet bestellt. Meine ersten 3 Ergebnisse haben die gleiche Partnum und Verpackung mit Mengen von 32,0, 50,8 und 51,0.

Wenn ich jedoch die Abfrage von meinem Programm ausführen, wird die Ergebnismenge mit der Menge 50.8 zuerst zurückgegeben. Der Datentyp von Quantity ist dezimal (18,9). Ich habe versucht zu casten, es scheint kein Datatypeproblem zu sein.

Ich kann nicht herausfinden, warum es die mittlere Menge bekommen.


Danke Jungs für die schnellen Antworten aber nach ein wenig mehr Tests ich mein Problem in meinem C# -Code gefunden, nicht die SQL.

Nachdem die Abfrage-Ergebnisse bekomme ich dafür hatten:

if (PurchOrder.Read())
while (PurchOrder.Read())

die Tatsache übersehen, dass die erste Lese in der Tat würde mein erstes Ergebnis lesen, dann whould die während mein zweites Ergebnis erhalten.

Ive ersetzen Sie die if-Anweisung mit:

if (PurchOrder.HasRows == true)

und alles schaut fein.

Nochmals vielen Dank für die Antworten. Entschuldigung für die irreführende Frage.

-Cody

+16

Bitte zeigen Sie Ihren C# -Code. –

+2

Können Sie das Code-Snippet anzeigen, in dem Sie die Abfrage ausführen? – alf

+0

@GrantWinney Ich verstehe Ihren Kommentar nicht: 'Packaging' befindet sich in der' ORDER BY'-Klausel – phoog

Antwort

0

Vielen Dank für die schnellen Antworten, aber nach ein wenig mehr Tests fand ich mein Problem in meinem C# -Code, nicht die SQL.

Nachdem die Ergebnisse der Abfrage immer dafür hatten I:

if (PurchOrder.Read()) while (PurchOrder.Read())

Mit Blick auf die Tatsache, dass die erste Lese in der Tat mein erstes lesen würde Ergebnis, dann die Weile, die mein zweites Ergebnis bekommen würde.

Ive ersetzen Sie die if-Anweisung mit:

if (PurchOrder.HasRows == true)

und alles sieht gut aus.

Nochmals vielen Dank für die Antworten. Entschuldigung für die irreführende Frage.

-Cody

1

Wenn TEILNUM ist alphanumerisch, es ist nicht in numerischer Reihenfolge sortieren, gehen, wenn Sie entweder

  • Linke Pad TEILNUM, um genau die gleiche Anzahl von Zeichen

  • sortieren mit einer speziellen alphanumerischen Sortierung. Ich verwenden in der Regel:

    order by 
    RIGHT(REPLICATE('0', 1000) + LTRIM(RTRIM(CAST([field_name] AS VARCHAR(8000)))), 1000) 
    

Natürlich können Sie viel niedrigere padding Zahlen verwenden, wenn Sie Ihre Felder kleiner sind.

+1

Das OP gibt jedoch an, dass die drei Mengenwerte zu Datensätzen mit demselben Partnum-Wert gehören. Diese Datensätze würden benachbart sein, unabhängig davon, ob partnum numerisch oder alphanumerisch sortiert ist. – phoog

+1

Aber er sagte tatsächlich "in der SQL Server-Verwaltung, die Ergebnisse sind wie erwartet bestellt", so dass es kein Problem mit dem Datentyp sein kann. –

+0

@marc_s Wie in **** hast du diesen Code richtig markiert? Ich habe eine Weile damit gespielt und versucht, es als Code-Snippet anzuzeigen, und konnte es in der Vorschau nicht korrekt formatieren ... –

0

Von der SQL Server-Seite, solange Partnum, Verpackung und Menge ein numerisches/float-Feld sind, sollte dies absolut gut funktionieren. Was mich beunruhigt ist, wenn Verpackung oder Partnum eine Textvariable ist, wobei 10 vor 2 steht.

Um dies zu vermeiden, müssen Sie CONVERT oder CAST den Datentyp in einen Integer-/Dezimal-Typ eingeben, bevor Sie ORDER BY ausführen. Nachschlagen CAST/Convert in BOL.

Zum Beispiel dieses:

CREATE TABLE #test 
(
mytest varchar(10) 
) 

INSERT INTO #test(mytest) VALUES('10') 
INSERT INTO #test(mytest) VALUES('1') 
INSERT INTO #test(mytest) VALUES('2') 
INSERT INTO #test(mytest) VALUES('12') 
INSERT INTO #test(mytest) VALUES('20') 

SELECT * FROM #test ORDER BY mytest 
DROP TABLE #test 

Erzeugt eine falsche Bestellung. Und könnte wie so behandelt werden:

SELECT * FROM #test ORDER BY CAST(mytest AS INT)

Soweit von der Client-Seite (C#) sind speichern Sie diese in einer Art von Gridview?

+0

Aber er sagte tatsächlich 'in der SQL Server-Verwaltung, die Ergebnisse sind wie erwartet bestellt, so dass es kein Problem mit dem Datentyp sein kann. –

+0

@MostyMostacho - Könnte sein ... aber er hat auch die gleiche Frage gestellt, nachdem er danach gefragt hat. – JonH