Ich muss einige In-Memory-Merging in C# von zwei sortierten Strömen von Zeichenfolgen aus einer oder mehreren SQL Server 2000-Datenbanken in einem einzigen sortierten Stream durchführen. Diese Datenströme können sehr groß sein, daher möchte ich nicht beide Ströme in den Speicher ziehen. Stattdessen muss ich jeweils ein Element aus jedem Stream im Speicher behalten und bei jedem Schritt das aktuelle Element aus jedem Stream vergleichen, das Minimum auf den endgültigen Stream schieben und das nächste Element aus dem entsprechenden Quellstream ziehen. Um dies korrekt durchzuführen, muss der speicherinterne Vergleich jedoch mit der Kollatierung der Datenbank übereinstimmen (beachten Sie die Streams [A,B,C]
und [A,B,C]
: Die korrekte zusammengefügte Sequenz ist [A,A,B,B,C,C]
, aber wenn Ihr speicherinternen Vergleich C < B
, Ihre In-Memory-Merge wird A,A,B
ergeben, an welcher Stelle es die C
an einem B
und einem C
und nachgeben suchen wird, in einem falsch sortiert Strom führt)VARCHAR-Sortierung versus VARBINARY-Sortierung in SQL Server 2000
Also, meine Frage ist:. ist es eine Möglichkeit, alle zu imitieren die Sortierungen in SQL Server 2000 mit einer System.StringComparison
Enumeration in C# oder umgekehrt? Der nächste, den ich gekommen bin, ist System.StringCompaison.Ordinal
mit den Ergebnissen der Datenbank-Strings zu VARBINARY
mit dem Standard VARBINARY
bestellen, die funktioniert, aber ich würde lieber nur eine "order by name collate X"
-Klausel zu meinen SQL-Abfragen hinzufügen, wo X ist eine Sortierung, die funktioniert genauso wie die VARBINARY
Sortierung, anstatt alle Zeichenfolgen in VARBINARY
zu konvertieren, wenn sie die Datenbank verlassen und dann zurück zu den Zeichenfolgen, wenn sie in den Speicher kommen.
Sind Sie sicher, dass _BIN für SQL Server 2000 gilt? –
Ich habe mehrere der BIN-Ordnungen versucht, einschließlich Latin1_General_BIN und Latin1_General_BIN2, aber sie sind nicht das gleiche wie StringComparison.Ordinal. Meine Testfälle umfassen das Erzeugen aller Byte-Strings bis zu einer bestimmten Länge, das Konvertieren in Strings mit System.Text.Encoding.Unicode.GetString, das Sortieren mit StringComparison.Ordinal und das Vergleichen der Ergebnisse mit dem, was mit "order" aus der Datenbank kommt durch Sortieren X ". Keine der _BIN- oder _BIN2-Anordnungen hat die sortierte In-Memory-Reihenfolge bereits erreicht. –
@Larry - Wie erzeugen Sie die Strings in der db? Genau wie Besetzung (0x ..... wie Nvarchar (N))? – ahains