Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik: SQL Server 2016 (13.x) és újabb verziók
Azure SQL Database
Felügyelt Azure SQL-példány
XML-dokumentumokat tömegesen importálhat egy SQL Server-adatbázisba, vagy tömegesen exportálhatja őket EGY SQL Server-adatbázisból. Ez a cikk mindkettőre mutat be példákat.
Ha adatokat szeretne tömegesen importálni egy adatfájlból EGY SQL Server-táblába vagy nem particionált nézetbe, az alábbi lehetőségeket használhatja:
bcp segédprogram
A bcp segédprogrammal adatokat exportálhat egy SQL Server-adatbázis bármely pontjáról, ahol egy
SELECTutasítás működik, beleértve a particionált nézeteket is.BULK INSERTINSERT ... SELECT * FROM OPENROWSET(BULK...)
További információkért lásd a következő cikkeket:
- Tömeges adatok importálása és exportálása a bcp használatával (SQL Server)
- Használja a TÖMEGES BESZÚRÁST vagy az OPENROWSET(BULK...) funkciót az adatok SQL Serverbe történő importálásához.
- XML importálása az SQL Serverbe az XML Tömeges terhelés összetevővel
- XML-sémagyűjtemények (SQL Server)
Példák
- Egy. XML-adatok tömeges importálása bináris bájtfolyamként
- B. XML-adatok tömeges importálása meglévő sorban
- C. XML-adatok tömeges importálása DTD-t tartalmazó fájlból
- D. A mezőelválasztó explicit megadása egy formátumfájl használatával
- E. XML-adatok tömeges exportálása
XML-adatok tömeges importálása bináris bájtfolyamként
Ha tömegesen importál XML-adatokat egy alkalmazni kívánt kódolási deklarációt tartalmazó fájlból, adja meg a SINGLE_BLOB beállítást a OPENROWSET(BULK...) záradékban. A SINGLE_BLOB beállítás biztosítja, hogy az SQL Server XML-elemzője az XML-deklarációban megadott kódolási séma szerint importálja az adatokat.
Mintatábla
Az A példa teszteléséhez hozzon létre mintatáblát T.
USE tempdb;
GO
CREATE TABLE T (
IntCol INT IDENTITY(1,1),
XmlCol XML
);
GO
Mintaadatfájl
Az A példa futtatása előtt létre kell hoznia egy UTF-8 kódolású fájlt (C:\SampleFolder\SampleData3.txt), amely a következő mintapéldányt tartalmazza, amely meghatározza a UTF-8 kódolási sémát.
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<ProductDescription ProductModelID="5">
<Summary>Some Text</Summary>
</ProductDescription>
</Root>
A példa
Ez a példa a SINGLE_BLOB utasítás INSERT ... SELECT * FROM OPENROWSET(BULK...) beállításával importál adatokat egy SampleData3.txt nevű fájlból, és egy XML-példányt szúr be az egyoszlopos mintatáblába, T.
INSERT INTO T (XmlCol)
SELECT *
FROM OPENROWSET(
BULK 'C:\SampleFolder\SampleData3.txt',
SINGLE_BLOB)
AS x;
Az oszlopneveket az alábbiak szerint is explicit módon adhatja meg:
INSERT INTO T (
XmlCol
)
SELECT
x.BulkColumn
FROM OPENROWSET(
BULK 'C:\SampleFolder\SampleData3.txt',
SINGLE_BLOB)
AS x;
Megjegyzések
Ebben az esetben a SINGLE_BLOB használatával elkerülheti az XML-dokumentum kódolása (az XML-kódolási deklarációban meghatározottak szerint) és a kiszolgáló által sugallt sztringkódlap közötti eltérést.
Ha NCLOB- vagy CLOB-adattípusokat használ, és kódlap- vagy kódolási ütközésbe ütközik, tegye az alábbiak egyikét:
Távolítsa el az XML-deklarációt az XML-adatfájl tartalmának sikeres importálásához.
Adjon meg egy kódlapot a lekérdezés
CODEPAGEbeállításában, amely megfelel az XML-deklarációban használt kódolási sémának.Egyezzen vagy oldja fel az adatbázis rendezési beállításait egy nem Unicode XML kódolási sémával.
XML-adatok tömeges importálása meglévő sorban
Ez a példa bemutatja, hogyan használható a OPENROWSET tömegsorkészlet-szolgáltató, hogy XML-példányt adjon hozzá egy meglévő sorhoz vagy sorokhoz a mintatábla T-ben.
Jegyzet
A példa futtatásához először be kell fejeznie az A példában megadott tesztszkriptet. Ez a példa létrehozza a tempdb.dbo.T táblát, és tömegesen importál adatokat SampleData3.txt.
Mintaadatfájl
A B példa az előző példában szereplő SampleData3.txt mintaadatfájl módosított verzióját használja. A példa futtatásához módosítsa a fájl tartalmát az alábbiak szerint:
<Root>
<ProductDescription ProductModelID="10">
<Summary>Some New Text</Summary>
</ProductDescription>
</Root>
B példa
-- Query before update shows initial state of XmlCol values.
SELECT * FROM T;
UPDATE T
SET XmlCol = (
SELECT *
FROM OPENROWSET(
BULK 'C:\SampleFolder\SampleData3.txt',
SINGLE_BLOB
) AS x
)
WHERE IntCol = 1;
GO
XML-adatok tömeges importálása DTD-t tartalmazó fájlból
Fontos
Javasoljuk, hogy ne engedélyezze a dokumentumtípus-definíciók (DTD-k) támogatását, ha ez nem szükséges az XML-környezetben. A DTD-támogatás bekapcsolása növeli a kiszolgáló támadható felületét, és szolgáltatásmegtagadásos támadásnak teheti ki. Ha engedélyeznie kell a DTD-támogatást, csökkentheti ezt a biztonsági kockázatot, ha csak megbízható XML-dokumentumokat dolgoz fel.
A következő hibaüzenet jelenhet meg, ha bcp használatával importál XML-adatokat egy DTD-t tartalmazó fájlból:
SQLState = 42000, NativeError = 6359
Error = [Microsoft][SQL Server Native Client][SQL Server]Parsing XML with internal subset DTDs not allowed.
Use CONVERT with style option 2 to enable limited internal subset DTD support.
BCP copy %s failed
A probléma megoldásához importálhat XML-adatokat egy DTD-t tartalmazó adatfájlból a OPENROWSET(BULK...) függvénnyel, majd a parancs CONVERT záradékában adja meg a SELECT lehetőséget. A parancs alapszintaxisa a következő:
INSERT ... SELECT CONVERT(...) FROM OPENROWSET(BULK...)
Mintaadatfájl
A tömeges importálási példa tesztelése előtt hozzon létre egy fájlt (C:\SampleFolder\Dtdfile.xml), amely a következő mintapéldányt tartalmazza:
<!DOCTYPE DOC [<!ATTLIST elem1 attr1 CDATA "defVal1">]><elem1>January</elem1>
Mintatábla
A C példa a következő T1 utasítással létrehozott CREATE TABLE mintatáblát használja:
USE tempdb;
GO
CREATE TABLE T1(XmlCol XML);
GO
C példa
Ez a példa OPENROWSET(BULK...) használja, és a(z) CONVERT opciót adja meg a(z) SELECT záradékban az XML-adatok Dtdfile.xml-ból a T1mintatáblába való importálásához.
INSERT INTO T1
SELECT CONVERT(XML, BulkColumn, 2)
FROM OPENROWSET(
BULK 'C:\SampleFolder\Dtdfile.xml',
SINGLE_BLOB
) AS [rowsetresults];
A INSERT utasítás végrehajtása után a rendszer eltávolítja a DTD-t az XML-ből, és a T1 táblában tárolja.
A mező terminátorának explicit megadása formátumfájl használatával
Az alábbi példa bemutatja, hogyan importálhatja tömegesen a következő XML-dokumentumot, Xmltable.dat.
Mintaadatfájl
A Xmltable.dat dokumentuma két XML-értéket tartalmaz, egyet minden sorhoz. Az első XML-érték UTF-16 kódolású, a második pedig UTF-8 kóddal van kódolva.
Az adatfájl tartalma a következő hexadecimális memóriaképben jelenik meg.
FF FE 3C 00 3F 00 78 00-6D 00 6C 00 20 00 76 00 *..\<.?.x.m.l. .v.*
65 00 72 00 73 00 69 00-6F 00 6E 00 3D 00 22 00 *e.r.s.i.o.n.=.".*
31 00 2E 00 30 00 22 00-20 00 65 00 6E 00 63 00 *1...0.". .e.n.c.*
6F 00 64 00 69 00 6E 00-67 00 3D 00 22 00 75 00 *o.d.i.n.g.=.".u.*
74 00 66 00 2D 00 31 00-36 00 22 00 3F 00 3E 00 *t.f.-.1.6.".?.>.*
3C 00 72 00 6F 00 6F 00-74 00 3E 00 A2 4F 9C 76 *\<.r.o.o.t.>..O.v*
0C FA 77 E4 80 00 89 00-00 06 90 06 91 2E 9B 2E *..w.............*
99 34 A2 34 86 00 83 02-92 20 7F 02 4E C5 E4 A3 *.4.4..... ..N...*
34 B2 B7 B3 B7 FE F8 FF-F8 00 3C 00 2F 00 72 00 *4.........\<./.r.*
6F 00 6F 00 74 00 3E 00-00 00 00 00 7A EF BB BF *o.o.t.>.....z...*
3C 3F 78 6D 6C 20 76 65-72 73 69 6F 6E 3D 22 31 *\<?xml version="1*
2E 30 22 20 65 6E 63 6F-64 69 6E 67 3D 22 75 74 *.0" encoding="ut*
66 2D 38 22 3F 3E 3C 72-6F 6F 74 3E E4 BE A2 E7 *f-8"?><root>....*
9A 9C EF A8 8C EE 91 B7-C2 80 C2 89 D8 80 DA 90 *................*
E2 BA 91 E2 BA 9B E3 92-99 E3 92 A2 C2 86 CA 83 *................*
E2 82 92 C9 BF EC 95 8E-EA 8F A4 EB 88 B4 EB 8E *................*
B7 EF BA B7 EF BF B8 C3-B8 3C 2F 72 6F 6F 74 3E *.........</root>*
00 00 00 00 7A *....z*
Mintatábla
XML-dokumentumok tömeges importálásakor vagy exportálásakor olyan mezőleválasztót kell használnia,, amely nem jelenhet meg egyik dokumentumban sem; például egy négy nullból (\0) álló sorozatot, amelyet a z: \0\0\0\0zbetű követ.
Ez a példa bemutatja, hogyan használhatjuk ezt a mező lezárót a xTable mintatáblánál. A mintatábla létrehozásához használja a következő CREATE TABLE utasítást:
USE tempdb;
GO
CREATE TABLE xTable (xCol XML);
GO
Mintaformátumfájl
A mezőelválasztót meg kell adni a formátumfájlban. A D példa egy Xmltable.fmt nevű nem XML formátumú fájlt használ, amely a következő kimenetet tartalmazza:
9.0
1
1 SQLBINARY 0 0 "\0\0\0\0z" 1 xCol ""
Ezzel a formátumfájllal tömegesen importálhat XML-dokumentumokat a xTable táblába egy bcp paranccsal, BULK INSERT vagy INSERT ... SELECT * FROM OPENROWSET(BULK...) utasítással.
D példa
Ez a példa egy Xmltable.fmt utasítás BULK INSERT formátumfájlját használja egy Xmltable.datnevű XML-adatfájl tartalmának importálásához.
BULK INSERT xTable
FROM 'C:\SampleFolder\Xmltable.dat'
WITH (FORMATFILE = 'C:\SampleFolder\Xmltable.fmt');
GO
XML-adatok tömeges exportálása
Az alábbi példa bcp használatával exportálja az XML-adatokat az előző példában létrehozott táblából ugyanazzal az XML-formátumfájllal. A következő bcp parancsban <server_name> és <instance_name> a megfelelő értékekkel helyettesítendő helyőrzőket jelölik:
bcp bulktest..xTable out a-wn.out -N -T -S<server_name>\<instance_name>
Jegyzet
Az SQL Server nem menti az XML-kódolást, ha az XML-adatok megmaradnak az adatbázisban. Ezért az XML-mezők eredeti kódolása nem érhető el XML-adatok exportálásakor. Az SQL Server UTF-16 kódolást használ az XML-adatok exportálásakor.