SQL-Sortierung Konflikt mit der temp-Tabelle und-Verfahren params kommen aus den Delphi-app
Ich arbeite mit dem MS SQL ein paar Jahre jetzt, und ich nie begegnet bin, so etwas auf meinem vorherigen job. Aber wo ich jetzt arbeiten, ich bekam eine Fehlermeldung, dass ich würde wirklich gerne wissen, die Ursache.
Machte ich eine gespeicherte Prozedur und rief es in meinem Delphi 5 (ja ich weiß) app mit einigen Parametern. Dies funktionierte gut auf zwei Datenbanken (Exemplare aus verschiedenen Zeiten). Aber nun versuchte ich es auf ein anderes DB (wieder eine Kopie), aber es gab mir die folgende Fehlermeldung:
Cannot resolve the collation conflict between "Latin1_General_CI_AS" and
"SQL_Latin1_General_CP1_CI_AS" in the equal to operation.
Bekam ich dies durch erstellen einer temp-Tabelle und dann zu versuchen, einige Daten eingefügt werden. Ich bin mir auch nicht beitreten. Und das komische ist: wenn ich entfernen Sie die gesamte WHERE-Klausel funktioniert es. Wenn ich es verlasse (obwohl es nur vergleicht Parameter mit einer Tabelle), es funktioniert nicht.
create table #TOP (EDAID int, ParentID char(30), ChildID char(30),
Position int, OrgQty_modified_manually bit)
Dies fehlschlägt:
insert into #TOP
select EDAID, ParentID, ChildID, Position, OrgQty_modified_manually
from EDA_SOBOM
where OrderNr = @OrderNr
and Position = @Position
and LN = @LN
and DL = @DL
and rtrim(ChildID) = @CurrentPart
and rtrim(ParentID) = @ParentID
Dies funktioniert:
insert into #TOP
select EDAID, ParentID, ChildID, Position, OrgQty_modified_manually
from EDA_SOBOM
Den Prozedur-Parameter deklariert sind, wie diese:
@PartID char(30), @Position int, @Best.nr char(8),
@LN char(2), @DL char(2), @ParentID " char(30), @Modified-bit-Ausgabe
Ich habe eine Lösung gefunden hier: Nicht beheben können, die sortierungskonflikt zwischen "SQL_Latin1_General_CP1_CI_AS" und "Latin1_General_CI_AS" im equal to-operation.
Also habe ich diese gleich nach dem ERSTELLEN:
ALTER TABLE #TOP
ALTER COLUMN ParentID
VARCHAR(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
ALTER TABLE #TOP
ALTER COLUMN ChildID
VARCHAR(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
Und das machte die ganze Sache wieder funktionieren...aber ich verstehe es nicht, warum die WHERE-Klausel mit nur parameter Vergleiche nicht...können Parameter haben, die Sortierung zu?
DB-Sortierung SQL_Latin1_General_CP1_CI_AS.
Tabelle EDA_SOBOM hat auch die Sortierung SQL_Latin1_General_CP1_CI_AS auf die char-Spalten.
Ich fand diese durch die folgende Abfrage:
SELECT col.name, col.collation_name
FROM sys.columns col
WHERE object_id = OBJECT_ID('EDA_SOBOM')
Gibt es einen anderen Ort, wo die Sortierung kann festgelegt werden, abgesehen von den DB-Pegel und Spalte Ebene?
Frage ich mich was Los ist...
- Andere Lösung hier: stackoverflow.com/questions/847636/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sortierung Konflikte kommen auf alle Operatoren zum vergleichen von strings in verschiedenen Sortierungen, d.h. nach dem Gleichheitszeichen in der select.
TempDb dauert die server-default-collation, während Ihre realen Dbs kann eine andere haben, und keine erstellte temporäre Tabellen mithilfe von DDL zu haben, eine Sortierung Unterschied.
Können Sie "Sortieren database_default" - Klauseln nach Gleichheit Betreiber das Problem beheben sollte.
Oder Sie können erstellen Sie Ihre temporären Tabelle verwenden:
Dadurch zwingen Sie die temp-Tabellen-Spalten, um die Daten-Typ (& Sortierung) aus Ihrer Datenbank.
Es ist ein server-level-Sortierung-Einstellung als Standard für alle dbs-system.
Es ist ein Datenbank-Ebene-Sortierung, wie Sie sagte.
Und Spalten und Ausdrücke können eine Sortierung definiert.
Viele Probleme entstehen, wenn eine Datenbank eine andere Sortierung aus dem system Datenbanken besonders tempdb.
Ohne Wiederholung Peter Wishart Antwort, die ich mit einverstanden, ich möchte nur hinzufügen, dass wenn ein Produkt zu entwickeln, sollten Sie entscheiden, welche Ebene der Sortierung der Flexibilität, die Sie gehen zu ermöglichen. Um Probleme zu vermeiden, müssen Sie design-code rund um die Wahl. Wenn Sie nicht zu verlangen, dass Sie Ihre Datenbank-Objekte werden im Einklang mit der server-Sortierung, dann wenden Sie sich Sortierung Modifikatoren gesteuert oder Sortierungen verwendet werden, wenn Tabellen in tempdb erstellt, oder system-Tabellen verwendet werden oder wenn vergleicht sind fertig. Das kann eine Menge von code in ein großes Produkt.
Gibt es eine andere Sortierung, die oft übersehen wird, in SQL Server. Das ist die Standard-Sortierung verwendet .Netto-SPs oder Funktionen. Diese Sortierung ist definiert basierend auf der SQLServer-Prozess die windows-Benutzer-Profil. Es ist oft nicht genannt, eine Sortierung in docs, Es ist Teil des regionalen windows-Einstellungen. Genannt LCID in der registry.
So, auch wenn Ihre Datenbank, sqlserver, Tabelle, Spalten-Sortierungen, die alle übereinstimmen, können Sie immer noch Abweichungen, wenn Sie string vergleicht in der gespeicherten CLR-Prozedur-code, es sei denn, Sie schreiben code, Sie zu vermeiden.
Lösen den Konflikt der Sortierung hinzufügen "COLLATE DATABASE_DEFAULT" keywords rund um " = " - operator.
Hoffe, das hilft...