Import polskich znaków z xml

Import polskich znaków z xml
S7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0

witam,
Próbuje zaimportować pliki XML UTF8 z danymi do bazy. Napotykam problem przy polskich znakach, nie importują się one poprawnie. Co może być tego przyczyną? Plik XML jest dobry. Pole w bazie typu nvarchar, bezpośrednio insert into działa z polskimi znakami ale z innych plików nie. Mój skrypt:

Kopiuj
USE nazwabazy

-- Upewnij się, że masz włączoną opcję Ad Hoc Distributed Queries
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;

DECLARE @xml NVARCHAR(MAX);

-- Wczytaj plik XML do zmiennej
SELECT @xml = CONVERT(NVARCHAR(MAX), BulkColumn)
FROM OPENROWSET(BULK 'sciezka do pliku xml', SINGLE_CLOB) AS x;

-- Zainicjalizuj dokument XML
DECLARE @hDoc INT;
EXEC sp_xml_preparedocument @hDoc OUTPUT, @xml;

-- Wstaw dane do tabeli
INSERT INTO pracownicy (zdjecie, imie, nazwisko, nr_poz)
SELECT 
    CAST(CAST(z.zdjecieBase64 AS XML).value('.', 'NVARCHAR(MAX)') AS VARBINARY(MAX)),
    z.imie,
    z.nazwisko,
    z.nr_poz
FROM OPENXML(@hDoc, '/root/pracownicy/pracownik', 2)
WITH (
    zdjecieBase64 NVARCHAR(MAX) 'zdjecieBase64',
    imie NVARCHAR(50) 'imie',
    nazwisko NVARCHAR(50) 'nazwisko',
    nr_poz NVARCHAR(10) 'nr_poz',
    data_wyd NVARCHAR(10) 'data_wyd'
) AS z;

-- Zakończ dokument XML
EXEC sp_xml_removedocument @hDoc;
ŁF
  • Rejestracja: dni
  • Ostatnio: dni
0

Tak z ciekawości, bo raczej nie jest to źródłem Twojego problemu, skoro insert bezpośrednio do bazy działa - jakie masz collation bazy danych/tabeli?

Próbowałeś ustawić CODEPAGE dla OPENROWSET (vide https://learn.microsoft.com/en-us/sql/t-sql/functions/openrowset-transact-sql?view=sql-server-ver16#use-openrowset-with-the-bulk-option)? Zrób selecty wartości podczas ich przetwarzania, informacja o stronie kodowej jest gubiona gdzieś pomiędzy plikiem, a insertem, kwestia znalezienia gdzie dokładnie, znalezienie rozwiązania powinno być już potem proste.

BTW zdjecieBase64 NVARCHAR(MAX) jest cokolwiek suboptymalne. Base64 zawiera tylko znaki z przedziału 64-127.

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3891
1
Kopiuj
SELECT @xml = CONVERT(NVARCHAR(MAX), BulkColumn)
FROM OPENROWSET(BULK 'sciezka do pliku xml', SINGLE_CLOB) AS x;

Zgodnie z dokumentacją: SINGLE_CLOB By reading data_file as ASCII, returns the contents as a single-row, single-column rowset of type varchar(max), using the collation of the current database.
Tu "gubisz" polskie znaki użyj SINGLE_BLOB

Z dokumentacji:

screenshot-20241104131417.png

https://learn.microsoft.com/en-us/sql/t-sql/functions/openrowset-transact-sql?view=sql-server-ver16

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.