SQL Server vermeidet es, den Sortierungstyp in einer Abfrage mehrmals zu wiederholen

8

Ich habe eine Abfrage, die Zeilen aus einer Quellendatenbank (DatabaseA) auswählt und in eine Zieldatenbank (Database B) einfügt. Der Sortierungstyp unterscheidet sich zwischen den Datenbanken und kann nicht geändert werden. Ich muss den Kollatierungsunterschied in meiner Abfrage beheben, indem ich die Kollatierung für varchar-Felder explizit spezifiziere.

Derzeit sieht meine Anfrage folgendermaßen aus:

INSERT INTO DatabaseB.dbo.Users(
    Id,
    UserNumber,
    FirstName,
    Surname,
    Address1,
    Address2,
    AddressTown,
    AddressCity
)
SELECT 
    Id,
    UserNumber,
    FirstName COLLATE SQL_Latin1_General_CI_AS,
    Surname COLLATE SQL_Latin1_General_CI_AS,
    Address1 COLLATE SQL_Latin1_General_CI_AS,
    Address2 COLLATE SQL_Latin1_General_CI_AS,
    AddressTown COLLATE SQL_Latin1_General_CI_AS,
    AddressCity COLLATE SQL_Latin1_General_CI_AS
FROM DatabaseA.dbo.Users

Meine Frage ist, kann ich vermeiden, den Kollatierungstyp für jedes stringbasierte Feld einzugeben? Gibt es eine Möglichkeit, den Sortierungstyp für die gesamte Abfrage auf einmal anzugeben? Wenn dies nicht möglich ist, gibt es andere Verknüpfungen?

Laurence Frost
quelle
Es gibt keine Verknüpfung. Sie können stattdessen database_default verwenden (wenn Sie dies bevorzugen) und wenn dies in diesem Fall korrekt ist.
SqlWorldWide

Antworten:

9

Sie können eine Ansicht einmal mit folgenden Spaltendefinitionen erstellen:

FirstName COLLATE SQL_Latin1_General_CI_AS, ...

Wenn Sie dann Benutzertabellen verwenden möchten, können Sie stattdessen diese Ansicht verwenden.

sepupic
quelle
5

Sortierungen werden für jede Zeichenfolgenspalte / jeden Ausdruck angegeben (XML-Datentyp ausgeschlossen). Nein, in diesem Sinne können Kollatierungen nicht pro Tabelle oder Abfrage festgelegt werden.

Ich muss den Kollatierungsunterschied in meiner Abfrage beheben, indem ich die Kollatierung für varchar-Felder explizit spezifiziere.

Ähm, warum? Sie sollten sich für eine INSERTAussage nicht damit befassen müssen . Kollatierungskonflikte treten entweder beim Vergleichen von zwei Spalten oder beim Kombinieren von zwei oder mehr Spalten in a auf UNION. Wie Sie anhand des folgenden Tests sehen können (führen Sie ihn einfach in einer Datenbank aus, die es nicht ist tempdb), gibt es zwei Tabellen, die sich jeweils in einer anderen Datenbank befinden und jeweils eine andere Sortierung aufweisen - eine ist eine SQL Server-Sortierung und eine eine Windows-Sortierung gerade - und es gibt keinen Fehler. Wenn Sie eine Fehlermeldung erhalten, geben Sie bitte weitere Details in der Frage an.

--DROP TABLE #tmp;
CREATE TABLE #tmp (Col1 VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS);
INSERT INTO #tmp ([Col1]) VALUES ('n');

-- DROP TABLE dbo.Tmp;
CREATE TABLE dbo.Tmp (Col1 VARCHAR(50) COLLATE Hebrew_100_CS_AI);

INSERT INTO dbo.Tmp ([Col1])
  SELECT t.[Col1]
  FROM #tmp t;
Solomon Rutzky
quelle
Wie wäre es mit diesem? <br/> code CREATE TABLE #tmp (Col1 VARCHAR (50) COLLATE Cyrillic_General_CI_AS); INSERT IN #tmp ([Col1]) VALUES (N'кириллическая строка '); - DROP TABLE dbo.Tmp; CREATE TABLE dbo.Tmp (Col1 VARCHAR (50) COLLATE SQL_Latin1_General_CP1_CI_AS); INSERT INTO dbo.Tmp ([Col1]) SELECT t. [Col1] FROM #tmp t; Wählen Sie * aus dbo.Tmp; code
Sepupic
Es tut mir leid, die Formatierung in Kommentaren ist unterschiedlich und ich kann den Code nicht in lesbarer Form eingeben. Ich möchte nur sagen, dass die Tatsache, dass Sie keinen Fehler erhalten, nicht bedeutet, dass Sie das Richtige getan haben. Versuchen Sie, meinen schrecklich formatierten Code auszuführen, in dem ich kyrillische ASCII-Zeichen in eine Spalte mit lateinischer Kollatierung kopiere, oder ändern Sie Ihr Beispiel so, dass Sie hebräische ASCII-Zeichen in eine nicht-Unicode-Spalte mit lateinischer Sortierung kopieren. Sie erhalten ?????? anstelle Ihrer Daten, was bedeutet, dass Sie Ihre Daten für immer verloren haben
sepupic
Ja, du bist absolut richtig. Die Frage sagt jedoch nichts darüber aus, dass die Zeichenkonvertierung das Problem ist oder NVARCHAR/ Unicode. Der aktuelle Wortlaut impliziert etwas VARCHARdazu VARCHAR. Bitte geben Sie beide Kollatierungen in der Frage an und ob dies eine einmalige oder laufende Operation ist. Außerdem formatiert ein einfaches Anführungszeichen den Code in Kommentaren. Hilfe (kann vom Editor abgerufen werden) hat eine Seite mit Markups in Kommentaren unterstützt :-)
Solomon Rutzky
Vielen Dank für Ihre Hilfe. Leider ist das Problem der realen Welt nicht so einfach wie das Beispiel, das ich oben erstellt habe. Ich habe es so gemacht, dass das Problem leicht zu visualisieren war. Die einzige Lösung besteht darin, den Kollatierungstyp für jedes Varchar-Feld anzugeben :(
Laurence Frost
@sepupic Es tut uns leid, dass Sie aufgefordert wurden, die Frage zu aktualisieren. Ich antwortete auf meinem Telefon und war mit den Anmeldenamen verwechselt. Ich habe Ihr Beispiel ausgeführt, und es macht natürlich keinen Sinn, ?da die kyrillischen Zeichen in Code Page 1252 (dh Latin1_General_CP1in der Zieltabelle) nicht vorhanden sind. Dieses Szenario profitiert nicht vom COLLATEHinzufügen des Schlüsselworts, sodass es nicht behandelt werden muss, da das OP anscheinend nach einem Szenario fragt, in dem das Hinzufügen COLLATEhilfreich ist.
Solomon Rutzky