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?
sql-server
insert
import
collation
bulk-insert
Laurence Frost
quelle
quelle
Antworten:
Sie können eine Ansicht einmal mit folgenden Spaltendefinitionen erstellen:
Wenn Sie dann Benutzertabellen verwenden möchten, können Sie stattdessen diese Ansicht verwenden.
quelle
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.
Ähm, warum? Sie sollten sich für eine
INSERT
Aussage nicht damit befassen müssen . Kollatierungskonflikte treten entweder beim Vergleichen von zwei Spalten oder beim Kombinieren von zwei oder mehr Spalten in a aufUNION
. Wie Sie anhand des folgenden Tests sehen können (führen Sie ihn einfach in einer Datenbank aus, die es nicht isttempdb
), 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.quelle
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
NVARCHAR
/ Unicode. Der aktuelle Wortlaut impliziert etwasVARCHAR
dazuVARCHAR
. 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 :-)?
da die kyrillischen Zeichen in Code Page 1252 (dhLatin1_General_CP1
in der Zieltabelle) nicht vorhanden sind. Dieses Szenario profitiert nicht vomCOLLATE
Hinzufügen des Schlüsselworts, sodass es nicht behandelt werden muss, da das OP anscheinend nach einem Szenario fragt, in dem das HinzufügenCOLLATE
hilfreich ist.