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...

InformationsquelleAutor SonOfGrey | 2012-05-11
Schreibe einen Kommentar