Delen via


Unicode-tekenindeling gebruiken om gegevens te importeren of exporteren (SQL Server)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Unicode-tekenindeling wordt aanbevolen voor bulkoverdracht van gegevens tussen meerdere exemplaren van SQL Server met behulp van een gegevensbestand met uitgebreide/DBCS-tekens. Met de Unicode-tekengegevensindeling kunnen gegevens worden geëxporteerd van een server, met behulp van een codepagina die verschilt van de codepagina die wordt gebruikt door de client die de bewerking uitvoert. In dergelijke gevallen heeft het gebruik van unicode-tekenindeling de volgende voordelen:

  • Als de bron- en doelgegevens Unicode-gegevenstypen zijn, behoudt het gebruik van de Unicode-tekenindeling alle tekengegevens.

  • Als de bron- en doelgegevens geen Unicode-gegevenstypen zijn, minimaliseert het gebruik van Unicode-tekenindeling het verlies van uitgebreide tekens in de brongegevens die niet op het doel kunnen worden weergegeven.

Overwegingen voor het gebruik van Unicode-tekenindeling

Wanneer u unicode-tekenindeling gebruikt, kunt u het volgende overwegen:

  • Het hulpprogramma bcp scheidt standaard de tekengegevensvelden met het tabteken en beëindigt de records met het nieuwe regelteken. Zie Veld- en rijeindtekens opgeven (SQL Server) voor meer informatie over het opgeven van alternatieve afsluiters.

  • De sql_variant gegevens die zijn opgeslagen in een Unicode-gegevensbestand met tekenindeling, werken op dezelfde manier als in een gewoon tekenindelingbestand, behalve dat de gegevens worden opgeslagen als nchar in plaats van char gegevens. Zie sortering en Unicode-ondersteuning voor meer informatie over tekenopmaak.

Speciale overwegingen voor het gebruik van Unicode-tekenindeling, bcp en een indelingsbestand

Gegevensbestanden met de Unicode-tekenindeling volgen de conventies voor Unicode-bestanden. De eerste twee bytes van het bestand zijn hexadecimale getallen, 0xFFFE. Deze bytes fungeren als bytevolgordemarkeringen (BOM), waarmee wordt opgegeven of de byte met hoge volgorde als eerste of laatste in het bestand wordt opgeslagen. Het bcp-hulpprogramma kan de BOM verkeerd interpreteren en ervoor zorgen dat een deel van het importproces mislukt; mogelijk krijgt u een foutbericht dat er als volgt uitziet:

Starting copy...
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]Invalid character value for cast specification

De BOM kan onder de volgende voorwaarden onjuist worden geïnterpreteerd:

  • Het bcp-hulpprogramma wordt gebruikt en de -w schakeloptie wordt gebruikt om Unicode-teken aan te geven

  • Er wordt een indelingsbestand gebruikt

  • Het eerste veld in het gegevensbestand is geen tekenreeks.

Overweeg of een van de volgende tijdelijke oplossingen beschikbaar is voor uw specifieke situatie:

Opdrachtopties voor Unicode-tekenindeling

U kunt Unicode-tekenindelingsgegevens importeren in een tabel met behulp van bcp, BULK INSERT of OPENROWSET. Voor een bcp-opdracht of BULK INSERT-instructie kunt u de gegevensindeling opgeven in de instructie. Voor een OPENROWSET-instructie moet u de gegevensindeling opgeven in een indelingsbestand.

Unicode-tekenindeling wordt ondersteund door de volgende opdrachtopties:

Bevelen Optie Beschrijving
bcp -w Maakt gebruik van de Unicode-tekenindeling.
BULK INSERT DATAFILETYPE ='widechar' Hiermee wordt de Unicode-tekenindeling gebruikt bij het bulksgewijs importeren van gegevens.
OPENROWSET N.V.T Moet een indelingsbestand gebruiken

Notitie

U kunt ook opmaak per veld opgeven in een indelingsbestand. Zie indelingsbestanden voor het importeren of exporteren van gegevens (SQL Server) voor meer informatie.

Voorbeeldtestvoorwaarden

De voorbeelden in dit artikel zijn gebaseerd op de volgende tabel en opmaakbestand.

Voorbeeldtabel

Met het volgende script maakt u een testdatabase, een tabel met de naam myWidechar en vult u de tabel met enkele initiële waarden. Voer de volgende Transact-SQL uit in Microsoft SQL Server Management Studio (SSMS):

CREATE DATABASE TestDatabase;
GO

USE TestDatabase;

CREATE TABLE dbo.myWidechar
(
    PersonID SMALLINT NOT NULL,
    FirstName NVARCHAR (25) NOT NULL,
    LastName NVARCHAR (30) NOT NULL,
    BirthDate DATE,
    AnnualSalary MONEY
);

-- Populate table
INSERT TestDatabase.dbo.myWidechar
VALUES (1, N'ϴAnthony', N'Grosse', '02-23-1980', 65000.00),
       (2, N'❤Alica', N'Fatnowna', '11-14-1963', 45000.00),
       (3, N'☎Stella', N'Rossenhain', '03-02-1992', 120000.00);

-- Review data
SELECT * FROM TestDatabase.dbo.myWidechar;

Voorbeeldbestand met niet-XML-indeling

SQL Server ondersteunt twee typen indelingsbestand: niet-XML-indeling en XML-indeling. De niet-XML-indeling is de oorspronkelijke indeling die wordt ondersteund door eerdere versies van SQL Server. Zie Niet-XML-indelingsbestanden (SQL Server) gebruikenvoor meer informatie.

De volgende opdracht maakt gebruik van het hulpprogramma bcp voor het genereren van een bestand met een niet-XML-indeling, myWidechar.fmt, op basis van het schema van myWidechar. Als u een bcp opdracht wilt gebruiken om een indelingsbestand te maken, geeft u het argument format op en gebruikt u nul in plaats van een pad naar een gegevensbestand. Voor de indelingsoptie is ook de -f optie vereist. Bovendien wordt in dit voorbeeld de kwalificatie c gebruikt om tekengegevens op te geven en T wordt gebruikt om een vertrouwde verbinding op te geven met geïntegreerde beveiliging. Voer bij een opdrachtprompt de volgende opdrachten in:

bcp TestDatabase.dbo.myWidechar format nul -f D:\BCP\myWidechar.fmt -T -w

REM Review file
Notepad D:\BCP\myWidechar.fmt

Belangrijk

Zorg ervoor dat het bestand met niet-XML-indeling eindigt met een regelterugloop\regelfeed. Anders krijgt u mogelijk het volgende foutbericht:

SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]I/O error while reading BCP format file

Voorbeelden

In de volgende voorbeelden wordt de database gebruikt en worden bestanden opgemaakt die eerder zijn gemaakt.

BCP- en Unicode-tekenindeling gebruiken om gegevens te exporteren

-w schakeloptie en OUT opdracht. Het gegevensbestand dat in dit voorbeeld is gemaakt, wordt gebruikt in alle volgende voorbeelden. Voer bij een opdrachtprompt de volgende opdrachten in:

bcp TestDatabase.dbo.myWidechar OUT D:\BCP\myWidechar.bcp -T -w

REM Review results
NOTEPAD D:\BCP\myWidechar.bcp

BCP- en Unicode-tekenindeling gebruiken om gegevens te importeren zonder een indelingsbestand

-w schakeloptie en IN opdracht. Voer bij een opdrachtprompt de volgende opdrachten in:

REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myWidechar;"

REM Import data
bcp TestDatabase.dbo.myWidechar IN D:\BCP\myWidechar.bcp -T -w

REM Review results is SSMS

BCP- en Unicode-tekenindeling gebruiken om gegevens te importeren met een niet-XML-indelingsbestand

-w en -f schakelopties en IN opdrachten. Er moet een workaround worden gebruikt, aangezien dit voorbeeld bcp, een indelingsbestand, een Unicode-teken en het eerste gegevensveld in het gegevensbestand, een niet-teken, omvat. Zie Speciale overwegingen voor het gebruik van unicode-tekenindeling, bcp en een indelingsbestand eerder in het artikel. Het gegevensbestand myWidechar.bcp wordt gewijzigd door een extra record toe te voegen als een 'dummy'-record die vervolgens wordt overgeslagen met de -F 2 switch.

Voer bij een opdrachtprompt de volgende opdrachten in en volg de wijzigingsstappen:

REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myWidechar;"

REM Open data file
Notepad D:\BCP\myWidechar.bcp
REM Copy first record and then paste as new first record.  This additional record is the "dummy" record.
REM Close file.

REM Import data instructing bcp to skip dummy record with the -F 2 switch.
bcp TestDatabase.dbo.myWidechar IN D:\BCP\myWidechar.bcp -f D:\BCP\myWidechar.fmt -T -F 2

REM Review results is SSMS

REM Return data file to original state for usage in other examples
bcp TestDatabase.dbo.myWidechar OUT D:\BCP\myWidechar.bcp -T -w

BULK INSERT en Unicode-tekenindeling gebruiken zonder een indelingsbestand

DATAFILETYPE argument. Voer de volgende Transact-SQL uit in Microsoft SQL Server Management Studio (SSMS):

TRUNCATE TABLE TestDatabase.dbo.myWidechar; -- for testing

BULK INSERT TestDatabase.dbo.myWidechar FROM 'D:\BCP\myWidechar.bcp'
    WITH (DATAFILETYPE = 'widechar');

-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;

BULK INSERT en Unicode-tekenformaat gebruiken met een bestandsindeling die niet in XML is

FORMATFILE argument. Voer de volgende Transact-SQL uit in Microsoft SQL Server Management Studio (SSMS):

TRUNCATE TABLE TestDatabase.dbo.myWidechar; -- for testing

BULK INSERT TestDatabase.dbo.myWidechar FROM 'D:\BCP\myWidechar.bcp'
    WITH (FORMATFILE = 'D:\BCP\myWidechar.fmt');

-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;

OPENROWSET- en Unicode-tekenindeling gebruiken met een niet-XML-indelingsbestand

FORMATFILE argument. Voer de volgende Transact-SQL uit in Microsoft SQL Server Management Studio (SSMS):

TRUNCATE TABLE TestDatabase.dbo.myWidechar; -- for testing

INSERT INTO TestDatabase.dbo.myWidechar
SELECT * FROM OPENROWSET (
    BULK 'D:\BCP\myWidechar.bcp',
    FORMATFILE = 'D:\BCP\myWidechar.fmt'
) AS t1;

-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;

Gegevensindelingen gebruiken voor bulkimport of bulkexport