it-swarm.com.de

Kollatierungskonflikt für temporäre Tabelle - Fehler: Der Kollatierungskonflikt zwischen Latin1 * und SQL_Latin1 * kann nicht aufgelöst werden.

Ich kann die temporäre Tabelle nicht aktualisieren. Dies ist meine Anfrage

CREATE TABLE #temp_po(IndentID INT, OIndentDetailID INT, OD1 VARCHAR(50), OD2 VARCHAR(50), 
        OD3 VARCHAR(50), ORD VARCHAR(50), NIndentDetailID INT, ND1 VARCHAR(50), ND2 VARCHAR(50), 
        ND3 VARCHAR(50), NRD VARCHAR(50), Quantity DECIMAL(15,3))

        INSERT INTO #temp_po(IndentID, OIndentDetailID, OD1, OD2, OD3, ORD)
        SELECT ID.IndentID, ID.IndentDetailID, ID.D1, ID.D2, ID.D3, ID.RandomDimension 
        FROM STR_IndentDetail ID WHERE ID.IndentID = @IndentID

        UPDATE 
            t 
        SET
            t.ND1 = CASE WHEN D.D1 = '' THEN NULL ELSE D.D1 END,
            t.ND2 = CASE WHEN D.D2 = '' THEN NULL ELSE D.D2 END,
            t.ND3 = CASE WHEN D.D3 = '' THEN NULL ELSE D.D3 END,
            t.NRD = CASE WHEN D.RandomDim = '' THEN NULL ELSE D.RandomDim END,
            t.Quantity = D.PurchaseQty
        FROM
            #temp_po t INNER JOIN @detail D ON D.IndentDetailID = t.OIndentDetailID
        WHERE
            t.IndentID = @IndentID

Aber es gibt den Fehler

Der Kollatierungskonflikt zwischen "Latin1_General_CI_AI" und "SQL_Latin1_General_CP1_CI_AS" kann in der Gleichheitsoperation nicht gelöst werden.

Wie kann dieses Problem gelöst werden?

Meine tempdb-Kollatierung ist Latin1_General_CI_AI und meine tatsächliche Datenbanksortierung ist SQL_Latin1_General_CP1_CI_AS.

17
thevan

Dies geschieht, weil die Kollatierungen in #tempdb.temp_po.OD1 und STR_IndentDetail.D1 unterschiedlich sind. 

Da Sie die Erstellung der temporären Tabelle steuern können, scheint es am einfachsten zu sein, * char-Spalten in der temporären Tabelle mit derselben Sortierung wie Ihre STR_IndentDetail-Tabelle zu erstellen:

CREATE TABLE #temp_po(
    IndentID INT, 
    OIndentDetailID INT, 
    OD1 VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS, 
    .. Same for the other *char columns   

In einer Situation, in der Sie keine Kontrolle über die Tabellenerstellung haben, können Sie beim Zusammenfügen der Spalten eine explizite COLLATE-Anweisung in der DML hinzufügen, bei der Fehler auftreten, entweder über COLLATE SQL_Latin1_General_CP1_CI_AS oder einfacher, indem Sie COLLATE DATABASE_DEFAULT verwenden.

SELECT * FROM #temp_po t INNER JOIN STR_IndentDetail s 
   ON t.OD1 = s.D1 COLLATE SQL_Latin1_General_CP1_CI_AS;

ODER einfacher

SELECT * FROM #temp_po t INNER JOIN STR_IndentDetail s 
   ON t.OD1 = s.D1 COLLATE DATABASE_DEFAULT;

SqlFiddle hier

29
StuartLC

Das Ändern der Server-Kollatierung ist keine direkte Entscheidung, möglicherweise gibt es andere Datenbanken auf dem Server, die möglicherweise betroffen sind. Auch das Ändern der Datenbanksortierung ist für eine vorhandene aufgefüllte Datenbank nicht immer ratsam. Ich denke, COLLATE DATABASE_DEFAULT beim Erstellen einer temporären Tabelle ist die sicherste und einfachste Option, da keine Kollatierung in Ihrer SQL hart codiert wird. Zum Beispiel:

CREATE TABLE #temp_table1
(
    column_1    VARCHAR(2)  COLLATE database_default
)
2
Maneesh Singh

Standardmäßig wird für die temporäre Tabelle die Sortierung des Servers verwendet. Aktualisieren Sie stattdessen alle gespeicherten Prozeduren mit temporärer Tabelle, und ändern Sie nur die Server-Sortierung.

Überprüfen Sie diesen Link auf Server-Sortierung setzen oder ändern

Das hat bei mir funktioniert.

0
Munavvar

Wir sind jetzt auf das gleiche Problem gestoßen. Anstatt die Kollatierung der temporären Tabellenerstellung (oder jedem temporären Tabellenverknüpfungspunkt) hinzuzufügen, haben wir die temporäre Tabellenerstellung in eine Tabellenvariablendeklaration geändert.

0
IngoB