Udostępnij za pomocą


OPENROWSET BULK (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstancePunkt końcowy analizy SQL w usłudze Microsoft FabricMagazyn w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Funkcja OPENROWSET odczytuje dane z jednego lub wielu plików i zwraca zawartość jako zestaw wierszy. W zależności od usługi plik może być przechowywany w usłudze Azure Blob Storage, Azure Data Lake Storage, na dysku lokalnym, udziałach sieciowych itp. Możesz odczytywać różne formaty plików, takie jak tekst/CSV, Parquet lub wiersze JSON.

Funkcję OPENROWSET można odwołać w klauzuli FROM zapytania tak, jakby była to nazwa tabeli. Może służyć do odczytywania danych w SELECT instrukcji lub aktualizowania danych docelowych w instrukcjach UPDATE, INSERT, DELETE, MERGE, CTASlub CETAS .

  • OPENROWSET(BULK) jest przeznaczony do odczytywania danych z zewnętrznych plików danych.
  • OPENROWSET bez BULK jest przeznaczony do odczytywania z innego aparatu bazy danych. Aby uzyskać więcej informacji, zobacz OPENROWSET (Transact-SQL).

Ten artykuł i argument ustawiony w OPENROWSET(BULK) różnych platformach.

Szczegóły i linki do podobnych przykładów na innych platformach:

Transact-SQL konwencje składni

Składnia

For SQL Server, Azure SQL Database, SQL database in Fabric oraz Azure SQL Managed Instance:

OPENROWSET( BULK 'data_file_path',
            <bulk_option> ( , <bulk_option> )*
)
[
    WITH (  ( <column_name> <sql_datatype> [ '<column_path>' | <column_ordinal> ] )+ )
]

<bulk_option> ::=
   DATA_SOURCE = 'data_source_name' |

   -- file format options
   CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } |
   DATAFILETYPE = { 'char' | 'widechar' } |
   FORMAT = <file_format> |

   FORMATFILE = 'format_file_path' |
   FORMATFILE_DATA_SOURCE = 'data_source_name' |

   SINGLE_BLOB |
   SINGLE_CLOB |
   SINGLE_NCLOB |

   -- Text/CSV options
   ROWTERMINATOR = 'row_terminator' |
   FIELDTERMINATOR =  'field_terminator' |
   FIELDQUOTE = 'quote_character' |

   -- Error handling options
   MAXERRORS = maximum_errors |
   ERRORFILE = 'file_name' |
   ERRORFILE_DATA_SOURCE = 'data_source_name' |

   -- Execution options
   FIRSTROW = first_row |
   LASTROW = last_row |

   ORDER ( { column [ ASC | DESC ] } [ , ...n ] ) [ UNIQUE ] ] |

   ROWS_PER_BATCH = rows_per_batch

Składnia dla magazynu danych sieci szkieletowej

OPENROWSET( BULK 'data_file_path',
            <bulk_option> ( , <bulk_option> )*
)
[
    WITH (  ( <column_name> <sql_datatype> [ '<column_path>' | <column_ordinal> ] )+ )
]

<bulk_option> ::=
   DATA_SOURCE = 'data_source_name' |

   -- file format options
   CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } |
   DATAFILETYPE = { 'char' | 'widechar' } |
   FORMAT = <file_format> |

   -- Text/CSV options
   ROWTERMINATOR = 'row_terminator' |
   FIELDTERMINATOR =  'field_terminator' |
   FIELDQUOTE = 'quote_character' |
   ESCAPECHAR = 'escape_char' |
   HEADER_ROW = [true|false] |
   PARSER_VERSION = 'parser_version' |

   -- Error handling options
   MAXERRORS = maximum_errors |
   ERRORFILE = 'file_name' |

   -- Execution options
   FIRSTROW = first_row |
   LASTROW = last_row |

   ROWS_PER_BATCH = rows_per_batch

Arguments

Argumenty opcji BULK umożliwiają znaczącą kontrolę nad tym, gdzie rozpocząć i zakończyć odczytywanie danych, jak radzić sobie z błędami i jak dane są interpretowane. Można na przykład określić, że plik danych jest odczytywany jako pojedynczy wiersz, jednokolumny zestaw wierszy typu varbinary, varchar lub nvarchar. Domyślne zachowanie zostało opisane w poniższych opisach argumentów.

Aby uzyskać informacje o sposobie korzystania z BULK opcji, zobacz sekcję Uwagi w dalszej części tego artykułu. Aby uzyskać informacje o uprawnieniach wymaganych przez BULK tę opcję, zobacz sekcję Uprawnienia w dalszej części tego artykułu.

Aby uzyskać informacje na temat przygotowywania danych do importowania zbiorczego, zobacz Prepare data for bulk export or import.

ZBIORCZE "data_file_path"

Ścieżka lub identyfikator URI plików danych, których dane mają być odczytywane i zwracane jako zestaw wierszy.

Identyfikator URI może odwoływać się do usługi Azure Data Lake Storage lub Azure Blob Storage. Identyfikator URI plików danych, których dane mają być odczytywane i zwracane jako zestaw wierszy.

Obsługiwane formaty ścieżek to:

  • <drive letter>:\<file path> uzyskiwanie dostępu do plików na dysku lokalnym
  • \\<network-share\<file path> uzyskiwanie dostępu do plików w udziałach sieciowych
  • adls://<container>@<storage>.dfs.core.windows.net/<file path> aby uzyskać dostęp do usługi Azure Data Lake Storage
  • abs://<storage>.blob.core.windows.net/<container>/<file path> aby uzyskać dostęp do usługi Azure Blob Storage
  • s3://<ip-address>:<port>/<file path> uzyskiwanie dostępu do magazynu zgodnego z usługą s3

Note

Ten artykuł i obsługiwane wzorce identyfikatorów URI różnią się na różnych platformach. W przypadku wzorców identyfikatorów URI dostępnych w usłudze Microsoft Fabric Data Warehouse wybierz pozycję Sieć szkieletowa na liście rozwijanej wersji.

Począwszy od programu SQL Server 2017 (14.x), data_file może znajdować się w usłudze Azure Blob Storage. Aby zapoznać się z przykładami, zobacz Przykłady zbiorczego dostępu do danych w usłudze Azure Blob Storage.

  • https://<storage>.blob.core.windows.net/<container>/<file path> uzyskiwanie dostępu do usługi Azure Blob Storage lub Azure Data Lake Storage
  • https://<storage>.dfs.core.windows.net/<container>/<file path> aby uzyskać dostęp do usługi Azure Data Lake Storage
  • abfss://<container>@<storage>.dfs.core.windows.net/<file path> aby uzyskać dostęp do usługi Azure Data Lake Storage
  • https://onelake.dfs.fabric.microsoft.com/<workspaceId>/<lakehouseId>/Files/<file path> - dostęp do OneLake w Microsoft Fabric

Note

Ten artykuł i obsługiwane wzorce identyfikatorów URI różnią się na różnych platformach. W przypadku wzorców identyfikatorów URI dostępnych w programie SQL Server, usłudze Azure SQL Database i usłudze Azure SQL Managed Instance wybierz produkt z listy rozwijanej wersja.

Identyfikator URI może zawierać * znak zgodny z dowolną sekwencją znaków, co pozwala OPENROWSET dopasować wzorzec do identyfikatora URI. Ponadto może kończyć /** się w celu włączenia cyklicznego przechodzenia przez wszystkie podfoldery. W programie SQL Server to zachowanie jest dostępne począwszy od programu SQL Server 2022 (16.x).

Przykład:

SELECT TOP 10 *
FROM OPENROWSET(
    BULK '<scheme:>//pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/*.parquet'
);

Typy magazynów, do których można się odwoływać za pomocą identyfikatora URI, są wyświetlane w poniższej tabeli:

wersja Na miejscu Azure Storage OneLake w sieci szkieletowej S3 Google Cloud (GCS)
SQL Server 2017 (14.x), SQL Server 2019 (15.x) Tak Tak Nie. Nie. Nie.
SQL Server 2022 (16.x) Tak Tak Nie. Tak Nie.
Azure SQL Database Nie. Tak Nie. Nie. Nie.
Azure SQL Managed Instance Nie. Tak Nie. Nie. Nie.
Bezserwerowa pula SQL w usłudze Azure Synapse Analytics Nie. Tak Tak Nie. Nie.
Microsoft Fabric Warehouse i punkt końcowy analizy SQL Nie. Tak Tak Tak, używając skrótów OneLake w Fabric Tak, używając skrótów OneLake w Fabric
Baza danych SQL w usłudze Microsoft Fabric Nie. Tak, używając skrótów OneLake w Fabric Tak Tak, używając skrótów OneLake w Fabric Tak, używając skrótów OneLake w Fabric

Możesz użyć OPENROWSET(BULK) do odczytu danych bezpośrednio z plików przechowywanych w OneLake w Microsoft Fabric, konkretnie z folderu Pliki w Fabric Lakehouse. Eliminuje to konieczność użycia zewnętrznych kont przejściowych (takich jak USŁUGA ADLS Gen2 lub Blob Storage) i umożliwia zarządzanie obszarem roboczym, natywne pozyskiwanie w modelu SaaS przy użyciu uprawnień sieci szkieletowej. Ta funkcja obsługuje:

  • Odczytywanie z Files folderów w usłudze Lakehouse
  • Obciążenia między obszarami roboczymi w ramach tej samej dzierżawy
  • Natywne wymuszanie tożsamości przy użyciu identyfikatora Entra firmy Microsoft

Zapoznaj się z ograniczeniami , które mają zastosowanie zarówno do , jak COPY INTO i OPENROWSET(BULK).

DATA_SOURCE

DATA_SOURCE definiuje lokalizację główną ścieżki pliku danych. Umożliwia ona używanie ścieżek względnych w ścieżce BULK. Źródło danych jest tworzone za pomocą polecenia CREATE EXTERNAL DATA SOURCE.

Oprócz lokalizacji głównej można zdefiniować poświadczenia niestandardowe, które mogą służyć do uzyskiwania dostępu do plików w tej lokalizacji.

Przykład:

CREATE EXTERNAL DATA SOURCE root
WITH (LOCATION = '<scheme:>//pandemicdatalake.blob.core.windows.net/public')
GO
SELECT *
FROM OPENROWSET(
    BULK '/curated/covid-19/bing_covid-19_data/latest/*.parquet',
    DATA_SOURCE = 'root'
);

Opcje formatu pliku

STRONA KODOWA

Określa stronę kodów danych w pliku danych. CODEPAGE ma zastosowanie tylko wtedy, gdy dane zawierają znaki, varchar lub kolumny tekstowe z wartościami znaków większymi niż 127 lub mniejsze niż 32. Prawidłowe wartości to "ACP", "OEM", "RAW" lub "code_page":

Wartość STRONY KODOWEJ Description
ACP Konwertuje kolumny typu danych char, varchar lub text ze strony kodowej ANSI/Microsoft Windows (ISO 1252) na stronę kodową programu SQL Server.
OEM (ustawienie domyślne) Konwertuje kolumny typu danych char, varchar lub text ze strony kodowej systemu OEM na stronę kodów programu SQL Server.
RAW Żadna konwersja nie występuje z jednej strony kodu do innej. Jest to najszybsza opcja.
code_page Wskazuje stronę kodu źródłowego, na której są kodowane dane znaków w pliku danych; na przykład 850.

Important

Wersje przed programem SQL Server 2016 (13.x) nie obsługują strony kodowej 65001 (kodowanie UTF-8). CODEPAGE nie jest obsługiwaną opcją w systemie Linux.

Note

Zalecamy określenie nazwy sortowania dla każdej kolumny w pliku formatu, z wyjątkiem sytuacji, gdy opcja 65001 ma mieć priorytet w specyfikacji sortowania/strony kodowej.

TYP PLIKU DANYCH

Określa, że OPENROWSET(BULK) powinien odczytywać zawartość pliku z jednym bajtem (ASCII, UTF8) lub wiele bajtów (UTF16). Prawidłowe wartości to char i widechar:

Wartość DATAFILETYPE Wszystkie dane reprezentowane w:
char (wartość domyślna) Format znaku.

Aby uzyskać więcej informacji, zobacz Używanie formatu znaków do importowania lub eksportowania danych.
widechar Znaki Unicode.

Aby uzyskać więcej informacji, zobacz Używanie formatu znaków Unicode do importowania lub eksportowania danych.

FORMAT

Określa format przywoływnego pliku, na przykład:

SELECT *
FROM OPENROWSET(BULK N'<data-file-path>',
                FORMAT='CSV') AS cars;

Prawidłowe wartości to "CSV" (plik wartości rozdzielonych przecinkami zgodny ze standardem RFC 4180 ), "PARQUET", "DELTA" (wersja 1.0) i "JSONL", w zależności od wersji:

wersja CSV PARKIET DELTA JSONL
SQL Server 2017 (14.x), SQL Server 2019 (15.x) Tak Nie. Nie. Nie.
SQL Server 2022 (16.x) i nowsze wersje Tak Tak Tak Nie.
Azure SQL Database Tak Tak Tak Nie.
Azure SQL Managed Instance Tak Tak Tak Nie.
Bezserwerowa pula SQL w usłudze Azure Synapse Analytics Tak Tak Tak Nie.
Microsoft Fabric Warehouse i punkt końcowy analizy SQL Tak Tak Nie. Tak
Baza danych SQL w usłudze Microsoft Fabric Tak Tak Nie. Nie.

Important

Funkcja OPENROWSET może odczytywać tylko nowy format JSON rozdzielany wierszami . Znak nowego wiersza musi być używany jako separator między dokumentami JSON i nie można go umieścić w środku dokumentu JSON.

Opcja FORMAT nie musi być określona, jeśli rozszerzenie pliku w ścieżce kończy się ciągiem .csv, , .tsv, .parquet.parq, .jsonl, , .ldjsonlub .ndjson. Na przykład funkcja wie, OPENROWSET(BULK) że format jest parquet oparty na rozszerzeniu w poniższym przykładzie:

SELECT *
FROM OPENROWSET(
    BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet'
);

Jeśli ścieżka pliku nie kończy się jednym z tych rozszerzeń, musisz określić element FORMAT, na przykład:

SELECT TOP 10 *
FROM OPENROWSET(
      BULK 'abfss://nyctlc@azureopendatastorage.blob.core.windows.net/yellow/**',
      FORMAT='PARQUET'
)

FORMATFILE

Określa pełną ścieżkę pliku formatu. Program SQL Server obsługuje dwa typy plików formatu: XML i inne niż XML.

SELECT TOP 10 *
FROM OPENROWSET(
      BULK 'D:\XChange\test-csv.csv',
      FORMATFILE= 'D:\XChange\test-format-file.xml'
)

Plik formatu jest wymagany do definiowania typów kolumn w zestawie wyników. Jedynym wyjątkiem jest określenie SINGLE_CLOB, SINGLE_BLOBlub SINGLE_NCLOB; w tym przypadku plik formatu nie jest wymagany.

Aby uzyskać informacje o formatowaniu plików, zobacz Używanie pliku formatu do zbiorczego importowania danych (SQL Server).

Począwszy od programu SQL Server 2017 (14.x), format_file_path może znajdować się w usłudze Azure Blob Storage. Aby zapoznać się z przykładami, zobacz Przykłady zbiorczego dostępu do danych w usłudze Azure Blob Storage.

FORMATFILE_DATA_SOURCE

FORMATFILE_DATA_SOURCE definiuje lokalizację główną ścieżki pliku formatu. Umożliwia ona używanie ścieżek względnych w opcji FORMATFILE.

CREATE EXTERNAL DATA SOURCE root
WITH (LOCATION = '//pandemicdatalake/public/curated')
GO
SELECT *
FROM OPENROWSET(
    BULK '//pandemicdatalake/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
    FORMATFILE = 'covid-19/bing_covid-19_data/latest/bing_covid-19_data.fmt',
    FORMATFILE_DATA_SOURCE = 'root'
);

Źródło danych pliku formatu jest tworzone za pomocą polecenia CREATE EXTERNAL DATA SOURCE. Oprócz lokalizacji głównej można zdefiniować poświadczenia niestandardowe, które mogą służyć do uzyskiwania dostępu do plików w tej lokalizacji.

Opcje tekstowe/CSV

ROWTERMINATOR

Określa terminator wierszy, który ma być używany dla plików danych char i widechar , na przykład:

SELECT *
FROM OPENROWSET(
    BULK '<data-file-path>',
    ROWTERMINATOR = '\n'
);

Domyślny terminator wierszy to \r\n (znak nowego wiersza). Aby uzyskać więcej informacji, zobacz Określanie terminatorów pól i wierszy.

FIELDTERMINATOR

Określa terminator pola, który ma być używany dla plików danych char i widechar , na przykład:

SELECT *
FROM OPENROWSET(
    BULK '<data-file-path>',
    FIELDTERMINATOR = '\t'
);

Domyślnym terminatorem pola jest , (przecinek). Aby uzyskać więcej informacji, zobacz Określanie pól i terminatorów wierszy. Na przykład aby odczytać dane rozdzielane tabulatorami z pliku:

FIELDQUOTE = 'field_quote'

Począwszy od programu SQL Server 2017 (14.x), ten argument określa znak, który jest używany jako znak cudzysłowu w pliku CSV, podobnie jak w poniższym przykładzie w Nowym Jorku:

Empire State Building,40.748817,-73.985428,"20 W 34th St, New York, NY 10118","\icons\sol.png"
Statue of Liberty,40.689247,-74.044502,"Liberty Island, New York, NY 10004","\icons\sol.png"

Jako wartość tej opcji można określić tylko jeden znak. Jeśli nie zostanie określony, znak cudzysłowu (") jest używany jako znak cudzysłowu zdefiniowany w standardzie RFC 4180 . Znak FIELDTERMINATOR (na przykład przecinek) można umieścić w cudzysłowie pól i będzie traktowany jako zwykły znak w komórce opakowanej znakami FIELDQUOTE .

Na przykład w celu odczytania poprzedniego przykładowego zestawu danych CSV w Nowym Jorku użyj polecenia FIELDQUOTE = '"'. Wartości pola adresu będą zachowywane jako pojedyncza wartość, a nie podzielone na wiele wartości według przecinków w znakach " (cudzysłowu).

SELECT *
FROM OPENROWSET(
    BULK '<data-file-path>',
    FIELDQUOTE = '"'
);

PARSER_VERSION = 'parser_version'

Dotyczy do: Tylko Fabric Data Warehouse

Określa wersję analizatora, która ma być używana podczas odczytywania plików. Obecnie obsługiwane CSV wersje analizatora to 1.0 i 2.0:

  • PARSER_VERSION = '1.0'
  • PARSER_VERSION = '2.0'
SELECT TOP 10 *
FROM OPENROWSET(
      BULK 'abfss://nyctlc@azureopendatastorage.blob.core.windows.net/yellow/**',
      FORMAT='CSV',
      PARSER_VERSION = '2.0'
)

Parser CSV w wersji 2.0 to domyślna implementacja zoptymalizowana pod kątem wydajności, ale nie obsługuje wszystkich starszych opcji i kodowania dostępnych w wersji 1.0. Podczas korzystania z OPENROWSET, Fabric Data Warehouse automatycznie wraca do wersji 1.0, jeśli korzystasz z opcji obsługiwanych tylko w tej wersji, nawet jeśli wersja nie jest wyraźnie określona. W niektórych przypadkach może być konieczne jednoznaczne określenie wersji 1.0, aby rozwiązać błędy spowodowane nieobsługiwanymi funkcjami zgłaszanymi przez parser w wersji 2.0.

Specyfikator analizatora CSV w wersji 1.0:

  • Następujące opcje nie są obsługiwane: HEADER_ROW.
  • Domyślne terminatory to \r\n, \n i \r.
  • Jeśli jako terminator wierszy zostanie określony \n (nowy wiersz), zostanie on automatycznie poprzedzony znakiem \r (powrotu karetki), co powoduje zakończenie \r\nwiersza .

Specyfikator analizatora CSV w wersji 2.0:

  • Nie wszystkie typy danych są obsługiwane.
  • Maksymalna długość kolumny znaków wynosi 8000.
  • Maksymalny limit rozmiaru wiersza wynosi 8 MB.
  • Następujące opcje nie są obsługiwane: DATA_COMPRESSION.
  • Pusty ciąg zapisany jako ("") jest interpretowany jako pusty ciąg.
  • Opcja DATEFORMAT SET nie jest honorowana.
  • Obsługiwany format dla typu danych daty : YYYY-MM-DD
  • Obsługiwany format dla typu danych czasu : HH:MM:SS[.fractional seconds]
  • Obsługiwany format dla typu danych datetime2 : YYYY-MM-DD HH:MM:SS[.fractional seconds]
  • Domyślne terminatory to \r\n i \n.

ESCAPE_CHAR = 'char'

Określa znak w pliku, który jest używany do ucieczki siebie i wszystkich wartości ograniczników w pliku, na przykład:

Place,Address,Icon
Empire State Building,20 W 34th St\, New York\, NY 10118,\\icons\\sol.png
Statue of Liberty,Liberty Island\, New York\, NY 10004,\\icons\\sol.png

Jeśli po znaku ucieczki występuje wartość inna niż sam znak ucieczki lub którykolwiek z wartości ograniczników, znak ucieczki jest pomijany podczas odczytywania wartości.

Parametr ESCAPECHAR jest stosowany niezależnie od tego, czy FIELDQUOTE parametr jest włączony, czy nie jest włączony. Nie będzie używany do omijania znaku cudzysłowu. Znak cudzysłowu musi być zastąpiony innym znakiem cudzysłowu. Znak cudzysłów może pojawić się w wartości kolumny tylko wtedy, gdy wartość jest hermetyzowana znakami cudzysłów.

W poniższym przykładzie przecinek (,) i ukośnik odwrotny (\) są ucieczki i reprezentowane jako \, i :\\

SELECT *
FROM OPENROWSET(
    BULK '<data-file-path>',
    ESCAPECHAR = '\'
);

HEADER_ROW = { PRAWDZIWA | FAŁSZYWE }

Określa, czy plik CSV zawiera wiersz nagłówka, który nie powinien być zwracany z innymi wierszami danych. Przykładowy plik CSV z nagłówkiem jest pokazany w poniższym przykładzie:

Place,Latitude,Longitude,Address,Area,State,Zipcode
Empire State Building,40.748817,-73.985428,20 W 34th St,New York,NY,10118
Statue of Liberty,40.689247,-74.044502,Liberty Island,New York,NY,10004

Wartość domyślna to FALSE. Obsługiwane w PARSER_VERSION='2.0' Fabric Data Warehouse. Jeśli TRUEnazwy kolumn będą odczytywane z pierwszego wiersza zgodnie z argumentem FIRSTROW . Jeśli TRUE i schemat jest określony przy użyciu , WITHpowiązanie nazw kolumn będzie wykonywane według nazwy kolumny, a nie pozycji porządkowych.

SELECT *
FROM OPENROWSET(
    BULK '<data-file-path>',
    HEADER_ROW = TRUE
);

Opcje obsługi błędów

PLIK BŁĘDU = 'file_name'

Określa plik używany do zbierania wierszy, które mają błędy formatowania i nie można przekonwertować na zestaw wierszy OLE DB. Te wiersze są kopiowane do tego pliku błędu z pliku danych "tak, jak to jest".

SELECT *
FROM OPENROWSET(
    BULK '<data-file-path>',
    ERRORFILE = '<error-file-path>'
);

Plik błędu jest tworzony na początku wykonywania polecenia. Jeśli plik już istnieje, zostanie zgłoszony błąd. Ponadto tworzony jest plik kontrolny z rozszerzeniem .ERROR.txt. Ten plik odwołuje się do każdego wiersza w pliku błędu i zapewnia diagnostykę błędów. Po skorygowaniu błędów można załadować dane.

Począwszy od programu SQL Server 2017 (14.x), error_file_path może znajdować się w usłudze Azure Blob Storage.

ŹRÓDŁO_DANYCH_PLIKU_BŁĘDÓW

Począwszy od programu SQL Server 2017 (14.x), ten argument jest nazwanym zewnętrznym źródłem danych wskazującym lokalizację pliku błędu, który będzie zawierać błędy znalezione podczas importowania.

CREATE EXTERNAL DATA SOURCE root
WITH (LOCATION = '<root-error-file-path>')
GO
SELECT *
FROM OPENROWSET(
    BULK '<data-file-path>',
    ERRORFILE = '<relative-error-file-path>',
    ERRORFILE_DATA_SOURCE = 'root'
);

Aby uzyskać więcej informacji, zobacz CREATE EXTERNAL DATA SOURCE (Transact-SQL).

MAXERRORS = maximum_errors

Określa maksymalną liczbę błędów składniowych lub niekonformujących wierszy, zgodnie z definicją w pliku formatu, które mogą wystąpić przed OPENROWSET zgłasza wyjątek. Dopóki MAXERRORS nie zostanie osiągnięty, OPENROWSET ignoruje każdy zły wiersz, nie ładuje go i zlicza zły wiersz jako jeden błąd.

SELECT *
FROM OPENROWSET(
    BULK '<data-file-path>',
    MAXERRORS = 0
);

Wartość domyślna dla maximum_errors to 10.

Note

MAX_ERRORS nie ma zastosowania do CHECK ograniczeń ani do konwertowania typów danychbigint i pieniędzy.

Opcje przetwarzania danych

PIERWSZY RZĄD = first_row

Określa liczbę pierwszego wiersza do załadowania. Wartość domyślna to 1. Wskazuje to pierwszy wiersz w określonym pliku danych. Liczby wierszy są określane przez zliczanie terminatorów wierszy. FIRSTROW jest oparty na 1.

LASTROW = last_row

Określa liczbę ostatniego wiersza do załadowania. Wartość domyślna to 0. Wskazuje to ostatni wiersz w określonym pliku danych.

ROWS_PER_BATCH = rows_per_batch

Określa przybliżoną liczbę wierszy danych w pliku danych. Ta wartość jest oszacowaniem i powinna być przybliżeniem (w obrębie jednej wielkości) rzeczywistej liczby wierszy. Domyślnie ROWS_PER_BATCH jest szacowana na podstawie właściwości pliku (liczba plików, rozmiary plików, rozmiar zwracanych typów danych). Określanie ROWS_PER_BATCH = 0 jest takie samo jak pominięcie ROWS_PER_BATCH. Przykład:

SELECT TOP 10 *
FROM OPENROWSET(
    BULK '<data-file-path>',
    ROWS_PER_BATCH = 100000
);

ORDER ( { kolumna [ ASC | DESC ] } [ ,... n ] [ UNIQUE ] )

Opcjonalna wskazówka określająca sposób sortowania danych w pliku danych. Domyślnie operacja zbiorcza zakłada, że plik danych jest nieurządkowany. Wydajność może poprawić, jeśli optymalizator zapytań może wykorzystać zamówienie w celu wygenerowania bardziej wydajnego planu zapytań. Poniższa lista zawiera przykłady dotyczące określania sortowania może być korzystne:

  • Wstawianie wierszy do tabeli zawierającej indeks klastrowany, w którym dane zestawu wierszy są sortowane w kluczu indeksu klastrowanego.
  • Łączenie zestawu wierszy z inną tabelą, w której pasują kolumny sortowania i sprzężenia.
  • Agregowanie danych zestawu wierszy według kolumn sortowania.
  • Użycie zestawu wierszy jako tabeli źródłowej w klauzuli FROM zapytania, gdzie pasują kolumny sortowania i sprzężenia.

UNIQUE

Określa, że plik danych nie ma zduplikowanych wpisów.

Jeśli rzeczywiste wiersze w pliku danych nie są sortowane zgodnie z określoną kolejnością lub jeśli określono wskazówkę UNIQUE, a klucze duplikatów są obecne, zwracany jest błąd.

Aliasy kolumn są wymagane w przypadku użycia ORDER. Lista aliasów kolumn musi odwoływać się do tabeli pochodnej, która jest uzyskiwana przez klauzulę BULK. Nazwy kolumn określone w klauzuli ORDER odwołują się do tej listy aliasów kolumn. Nie można określić dużych typów wartości (varchar(max), nvarchar(max), varbinary(max)i xml) i dużych typów obiektów (tekst, ntext i obraz).

Opcje zawartości

SINGLE_BLOB

Zwraca zawartość data_file jako jednokolumtowy zestaw wierszy typu varbinary(max).

Important

Zalecamy importowanie danych XML tylko przy użyciu opcji SINGLE_BLOB, a nie SINGLE_CLOB i SINGLE_NCLOB, ponieważ tylko SINGLE_BLOB obsługuje wszystkie konwersje kodowania systemu Windows.

SINGLE_CLOB

Odczytując data_file jako ASCII, zwraca zawartość jako pojedynczy wiersz, jednokolumny zestaw wierszy typu varchar(max), używając sortowania bieżącej bazy danych.

SINGLE_NCLOB

Odczytując data_file jako Unicode, zwraca zawartość jako pojedynczy wiersz, jednokolumny zestaw wierszy typu nvarchar(max), używając sortowania bieżącej bazy danych.

SELECT * FROM OPENROWSET(
    BULK N'C:\Text1.txt',
    SINGLE_NCLOB
) AS Document;

ZE schematem

Schemat WITH określa kolumny definiujące zestaw wyników funkcji OPENROWSET. Zawiera definicje kolumn dla każdej kolumny, która zostanie zwrócona w wyniku i przedstawia reguły mapowania, które wiążą kolumny pliku bazowego z kolumnami w zestawie wyników.

W poniższym przykładzie:

  • Kolumna country_region ma typ varchar(50) i odwołuje się do kolumny bazowej o tej samej nazwie
  • Kolumna date odwołuje się do kolumny CSV/Parquet lub właściwości JSONL o innej nazwie fizycznej
  • Kolumna cases odwołuje się do trzeciej kolumny w pliku
  • Kolumna fatal_cases odwołuje się do zagnieżdżonej właściwości Parquet lub obiektu podrzędnego JSONL
SELECT *
FROM OPENROWSET(<...>) 
WITH (
        country_region varchar(50), --> country_region column has varchar(50) type and referencing the underlying column with the same name
        [date] DATE '$.updated',   --> date is referencing a CSV/Parquet column or JSONL property with a different physical name
        cases INT 3,             --> cases is referencing third column in the file
        fatal_cases INT '$.statistics.deaths'  --> fatal_cases is referencing a nested Parquet property or JSONL sub-object
     );

<column_name>

Nazwa kolumny, która zostanie zwrócona w zestawie wierszy wyników. Dane tej kolumny są odczytywane z podstawowej kolumny pliku o tej samej nazwie, chyba że zostaną zastąpione przez <column_path> lub <column_ordinal>. Nazwa kolumny musi być zgodna z regułami dotyczącymi identyfikatorów nazw kolumn.

<column_type>

Typ języka T-SQL kolumny w zestawie wyników. Wartości z pliku bazowego są konwertowane na ten typ, gdy OPENROWSET zwraca wyniki. Aby uzyskać więcej informacji, zobacz Typy danych w magazynie sieci szkieletowej.

<column_path>

Ścieżka rozdzielona kropką (na przykład $.description.location.lat) używana do odwołowania się do zagnieżdżonych pól w typach złożonych, takich jak Parquet.

<column_ordinal>

Liczba reprezentująca fizyczny indeks kolumny, która zostanie zamapowana na kolumnę w klauzuli WITH.

Permissions

OPENROWSET w przypadku zewnętrznych źródeł danych wymagane są następujące uprawnienia:

  • ADMINISTER DATABASE BULK OPERATIONS lub
  • ADMINISTER BULK OPERATIONS

Poniższy przykład języka T-SQL przyznaje ADMINISTER DATABASE BULK OPERATIONS podmiotowi zabezpieczeń.

GRANT ADMINISTER DATABASE BULK OPERATIONS TO [<principal_name>];

Jeśli docelowe konto magazynu jest prywatne, podmiot zabezpieczeń musi mieć również rolę Czytelnik danych obiektu blob usługi Storage (lub nowszą) przypisaną na poziomie kontenera lub konta magazynu.

Remarks

  • Klauzula FROM używana z SELECT może wywoływać OPENROWSET(BULK...) zamiast nazwy tabeli z pełną funkcjonalnością SELECT.

  • OPENROWSET z opcją BULK wymaga nazwy korelacji, znanej również jako zmienna zakresu lub alias, w klauzuli FROM. Nie można dodać AS <table_alias> wyników w błędzie Msg 491: "Należy określić nazwę korelacji dla zbiorczego zestawu wierszy w klauzuli from".

  • Można określić aliasy kolumn. Jeśli lista aliasów kolumn nie jest określona, plik formatu musi mieć nazwy kolumn. Określanie aliasów kolumn zastępuje nazwy kolumn w pliku formatu, na przykład:

    • FROM OPENROWSET(BULK...) AS table_alias
    • FROM OPENROWSET(BULK...) AS table_alias(column_alias,...n)
  • Instrukcja SELECT...FROM OPENROWSET(BULK...) wysyła zapytanie do danych w pliku bezpośrednio bez importowania danych do tabeli.

  • Instrukcja SELECT...FROM OPENROWSET(BULK...) może wyświetlać aliasy kolumn zbiorczych przy użyciu pliku formatu do określania nazw kolumn, a także typów danych.

Note

W przypadku używania OPENROWSETważne jest, aby zrozumieć, jak program SQL Server obsługuje personifikację. Aby uzyskać informacje na temat zagadnień dotyczących zabezpieczeń, zobacz Use BULK INSERT or OPENROWSET(BULK...) to import data to SQL Server.

W Microsoft Fabric Data Warehouse obsługiwane funkcje są podsumowane w tabeli:

Feature Supported Niedostępne
Formaty plików Parquet, CSV, JSONL Delta, Azure Cosmos DB, JSON, relacyjne bazy danych
Authentication Przejście EntraID/SPN, pamięć publiczna Sygnatura dostępu współdzielonego/SAK, nazwa SPN, dostęp zarządzany
Storage Azure Blob Storage, Azure Data Lake Storage, OneLake in Microsoft Fabric
Options Tylko pełny/bezwzględny identyfikator URI w OPENROWSET Ścieżka względnego identyfikatora URI w elemecie OPENROWSET, DATA_SOURCE
Partitioning Możesz użyć funkcji filepath() w zapytaniu.

Zbiorcze importowanie danych SQLCHAR, SQLNCHAR lub SQLBINARY

OPENROWSET(BULK...) zakłada, że jeśli nie określono, maksymalna długość SQLCHAR, SQLNCHARlub SQLBINARY danych nie przekracza 8000 bajtów. Jeśli importowane dane znajdują się w polu danych LOB zawierającym dowolną wartość varchar(max), nvarchar(max)lub obiekty varbinary(max ), które przekraczają 8000 bajtów, należy użyć pliku formatu XML, który definiuje maksymalną długość pola danych. Aby określić maksymalną długość, zmodyfikuj plik formatu i zadeklaruj atrybut MAX_LENGTH.

Note

Automatycznie wygenerowany plik formatu nie określa długości ani maksymalnej długości pola LOB. Można jednak edytować plik formatu i ręcznie określić długość lub maksymalną długość.

Zbiorcze eksportowanie lub importowanie dokumentów SQLXML

Aby zbiorczo wyeksportować lub zaimportować dane SQLXML, użyj jednego z następujących typów danych w pliku formatu.

Typ danych Effect
SQLCHAR lub SQLVARYCHAR Dane są wysyłane na stronie kodu klienta lub na stronie kodowej implikowanej przez sortowanie.
SQLNCHAR lub SQLNVARCHAR Dane są wysyłane jako Unicode.
SQLBINARY lub SQLVARYBIN Dane są wysyłane bez żadnej konwersji.

Funkcje metadanych pliku

Czasami musisz wiedzieć, który plik lub folder źródłowy koreluje z konkretnym wierszem w zbiorze wyników.

Możesz używać funkcji filepath oraz filename zwracać nazwy plików i/lub ścieżkę w zbiorze wyników. Możesz też użyć ich do filtrowania danych na podstawie nazwy pliku i/lub ścieżki folderu. W kolejnych sekcjach znajdziesz krótkie opisy wraz z próbkami.

Funkcja nazwy pliku

Funkcja ta zwraca nazwę pliku, z której pochodzi wiersz.

Typ danych zwrotnych to nvarchar(1024). Dla optymalnej wydajności zawsze przelewaj wynik funkcji nazwy pliku na odpowiedni typ danych. Jeśli używasz typu danych znaku, upewnij się, że jest użyta odpowiednia długość.

Poniższy przykład odczytuje pliki danych NYC Yellow Taxi za ostatnie trzy miesiące 2017 roku i zwraca liczbę przejazdów w jednym pliku. Część OPENROWSET zapytania określa, które pliki zostaną odczytane.

SELECT
    nyc.filename() AS [filename]
    ,COUNT_BIG(*) AS [rows]
FROM  
    OPENROWSET(
        BULK 'parquet/taxi/year=2017/month=9/*.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    ) nyc
GROUP BY nyc.filename();

Poniższy przykład pokazuje, jak filename() można użyć klauzuli WHERE do filtrowania plików do odczytu. Dostęp do całego folderu w OPENROWSET części zapytania i filtruje pliki w klauzuli WHERE .

Twoje wyniki będą takie same jak w poprzednim przykładzie.

SELECT
    r.filename() AS [filename]
    ,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
    BULK 'csv/taxi/yellow_tripdata_2017-*.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV',
        FIRSTROW = 2) 
        WITH (C1 varchar(200) ) AS [r]
WHERE
    r.filename() IN ('yellow_tripdata_2017-10.csv', 'yellow_tripdata_2017-11.csv', 'yellow_tripdata_2017-12.csv')
GROUP BY
    r.filename()
ORDER BY
    [filename];

Funkcja ścieżki pliku

Funkcja ta zwraca pełną ścieżkę lub część ścieżki:

  • Wywołany bez parametru, zwraca pełną ścieżkę pliku, z której pochodzi wiersz.
  • Wywołany parametrem, zwraca część ścieżki odpowiadającą dzikiej pozycji określonej w parametrze. Na przykład wartość parametru 1 zwraca część ścieżki odpowiadającą pierwszemu dziku.

Typ danych zwrotnych to nvarchar(1024). Dla optymalnej wydajności zawsze należy przypisać wynik filepath funkcji odpowiedniemu typowi danych. Jeśli używasz typu danych znaku, upewnij się, że jest użyta odpowiednia długość.

Poniższy przykład zawiera pliki danych NYC Yellow Taxi za ostatnie trzy miesiące 2017 roku. Zwraca liczbę przejazdów na ścieżkę pliku. Część OPENROWSET zapytania określa, które pliki zostaną odczytane.

SELECT
    r.filepath() AS filepath
    ,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
        BULK 'csv/taxi/yellow_tripdata_2017-1*.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV',
        FIRSTROW = 2
    )
    WITH (
        vendor_id INT
    ) AS [r]
GROUP BY
    r.filepath()
ORDER BY
    filepath;

Poniższy przykład pokazuje, jak filepath() można użyć klauzuli WHERE do filtrowania plików do odczytu.

Możesz użyć dzikich kart w OPENROWSET części zapytania i filtrować pliki w klauzuli WHERE . Twoje wyniki będą takie same jak w poprzednim przykładzie.

SELECT
    r.filepath() AS filepath
    ,r.filepath(1) AS [year]
    ,r.filepath(2) AS [month]
    ,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
        BULK 'csv/taxi/yellow_tripdata_*-*.csv',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT = 'CSV',
        FIRSTROW = 2
    )
WITH (
    vendor_id INT
) AS [r]
WHERE
    r.filepath(1) IN ('2017')
    AND r.filepath(2) IN ('10', '11', '12')
GROUP BY
    r.filepath()
    ,r.filepath(1)
    ,r.filepath(2)
ORDER BY
    filepath;

Examples

Ta sekcja zawiera ogólne przykłady, aby zademonstrować sposób używania OPENROWSET BULK składni.

A. Używanie funkcji OPENROWSET do zbiorczego wstawiania danych pliku do kolumny varbinary(max)

Dotyczy: Tylko program SQL Server.

Poniższy przykład tworzy małą tabelę do celów demonstracyjnych i wstawia dane plików z pliku o nazwie Text1.txt znajdującej C: się w katalogu głównym do kolumny varbinary(max).

CREATE TABLE myTable (
    FileName NVARCHAR(60),
    FileType NVARCHAR(60),
    Document VARBINARY(MAX)
);
GO

INSERT INTO myTable (
    FileName,
    FileType,
    Document
)
SELECT 'Text1.txt' AS FileName,
    '.txt' AS FileType,
    *
FROM OPENROWSET(
    BULK N'C:\Text1.txt',
    SINGLE_BLOB
) AS Document;
GO

B. Użyj dostawcy ZBIORCZEgo OPENROWSET z plikiem formatu, aby pobrać wiersze z pliku tekstowego

Dotyczy: Tylko program SQL Server.

W poniższym przykładzie użyto pliku formatu do pobrania wierszy z pliku tekstowego rozdzielanego tabulatorami, values.txt zawierającego następujące dane:

1     Data Item 1
2     Data Item 2
3     Data Item 3

Plik formatu values.fmtopisuje kolumny w values.txt:

9.0
2
1  SQLCHAR  0  10 "\t"    1  ID           SQL_Latin1_General_Cp437_BIN
2  SQLCHAR  0  40 "\r\n"  2  Description  SQL_Latin1_General_Cp437_BIN

To zapytanie pobiera te dane:

SELECT a.* FROM OPENROWSET(
    BULK 'C:\test\values.txt',
   FORMATFILE = 'C:\test\values.fmt'
) AS a;

C. Określanie pliku formatu i strony kodowej

Dotyczy: Tylko program SQL Server.

W poniższym przykładzie pokazano, jak używać jednocześnie opcji formatowania pliku i strony kodu.

INSERT INTO MyTable
SELECT a.* FROM OPENROWSET (
    BULK N'D:\data.csv',
    FORMATFILE = 'D:\format_no_collation.txt',
    CODEPAGE = '65001'
) AS a;

D. Uzyskiwanie dostępu do danych z pliku CSV przy użyciu pliku formatu

Dotyczy: SQL Server 2017 (14.x) i nowsze wersje.

SELECT * FROM OPENROWSET(
    BULK N'D:\XChange\test-csv.csv',
    FORMATFILE = N'D:\XChange\test-csv.fmt',
    FIRSTROW = 2,
    FORMAT = 'CSV'
) AS cars;

E. Uzyskiwanie dostępu do danych z pliku CSV bez pliku formatu

Dotyczy: Tylko program SQL Server.

SELECT * FROM OPENROWSET(
   BULK 'C:\Program Files\Microsoft SQL Server\MSSQL14\MSSQL\DATA\inv-2017-01-19.csv',
   SINGLE_CLOB
) AS DATA;
SELECT *
FROM OPENROWSET('MSDASQL',
    'Driver={Microsoft Access Text Driver (*.txt, *.csv)}',
    'SELECT * FROM E:\Tlog\TerritoryData.csv'
);

Important

Sterownik ODBC powinien być 64-bitowy. Otwórz kartę Sterowniki w aplikacji Połącz ze źródłem danych ODBC (Kreator importu i eksportu programu SQL Server) w systemie Windows, aby to sprawdzić. Istnieje 32-bitowa Microsoft Text Driver (*.txt, *.csv), która nie będzie działać z 64-bitową wersją sqlservr.exe.

F. Uzyskiwanie dostępu do danych z pliku przechowywanego w usłudze Azure Blob Storage

Dotyczy: SQL Server 2017 (14.x) i nowsze wersje.

W programie SQL Server 2017 (14.x) i nowszych wersjach w poniższym przykładzie użyto zewnętrznego źródła danych wskazującego kontener na koncie usługi Azure Storage i poświadczenie o zakresie bazy danych utworzone na potrzeby sygnatury dostępu współdzielonego.

SELECT * FROM OPENROWSET(
   BULK 'inv-2017-01-19.csv',
   DATA_SOURCE = 'MyAzureInvoices',
   SINGLE_CLOB
) AS DataFile;

Aby uzyskać pełne OPENROWSET przykłady, w tym konfigurowanie poświadczeń i zewnętrznego źródła danych, zobacz Przykłady zbiorczego dostępu do danych w usłudze Azure Blob Storage.

G. Importowanie do tabeli z pliku przechowywanego w usłudze Azure Blob Storage

W poniższym przykładzie pokazano, jak za pomocą polecenia OPENROWSET załadować dane z pliku CSV w lokalizacji magazynu obiektów blob platformy Azure, na której został utworzony klucz SYGNATURY dostępu współdzielonego. Lokalizacja usługi Azure Blob Storage jest skonfigurowana jako zewnętrzne źródło danych. Wymaga to poświadczenia o zakresie bazy danych przy użyciu sygnatury dostępu współdzielonego szyfrowanej przy użyciu klucza głównego w bazie danych użytkownika.

-- Optional: a MASTER KEY is not required if a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO

-- Optional: a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
    SECRET = '******srt=sco&sp=rwac&se=2017-02-01T00:55:34Z&st=2016-12-29T16:55:34Z***************';

-- Make sure that you don't have a leading ? in the SAS token, and that you
-- have at least read permission on the object that should be loaded srt=o&sp=r,
-- and that expiration period is valid (all dates are in UTC time)
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://****************.blob.core.windows.net/curriculum',
    -- CREDENTIAL is not required if a blob is configured for public (anonymous) access!
    CREDENTIAL = MyAzureBlobStorageCredential
);

INSERT INTO achievements
WITH (TABLOCK) (
    id,
    description
)
SELECT * FROM OPENROWSET(
    BULK 'csv/achievements.csv',
    DATA_SOURCE = 'MyAzureBlobStorage',
    FORMAT = 'CSV',
    FORMATFILE = 'csv/achievements-c.xml',
    FORMATFILE_DATA_SOURCE = 'MyAzureBlobStorage'
) AS DataFile;

H. Używanie tożsamości zarządzanej dla źródła zewnętrznego

Dotyczy: Azure SQL Managed Instance i Azure SQL Database

Poniższy przykład tworzy poświadczenia przy użyciu tożsamości zarządzanej, tworzy źródło zewnętrzne, a następnie ładuje dane z woluminu CSV hostowanego w źródle zewnętrznym.

Najpierw utwórz poświadczenie i określ magazyn obiektów blob jako źródło zewnętrzne:

CREATE DATABASE SCOPED CREDENTIAL sampletestcred
WITH IDENTITY = 'MANAGED IDENTITY';

CREATE EXTERNAL DATA SOURCE SampleSource
WITH (
    LOCATION = 'abs://****************.blob.core.windows.net/curriculum',
    CREDENTIAL = sampletestcred
);

Następnie załaduj dane z pliku CSV hostowanego w magazynie obiektów blob:

SELECT * FROM OPENROWSET(
    BULK 'Test - Copy.csv',
    DATA_SOURCE = 'SampleSource',
    SINGLE_CLOB
) as test;

I. Używanie zestawu OPENROWSET do uzyskiwania dostępu do kilku plików Parquet przy użyciu magazynu obiektów zgodnego z protokołem S3

Dotyczy: SQL Server 2022 (16.x) i nowszych wersjach.

W poniższym przykładzie użyto dostępu do kilku plików Parquet z innej lokalizacji, wszystkie przechowywane w magazynie obiektów zgodnym z usługą S3:

CREATE DATABASE SCOPED CREDENTIAL s3_dsc
WITH IDENTITY = 'S3 Access Key',
SECRET = 'contosoadmin:contosopwd';
GO

CREATE EXTERNAL DATA SOURCE s3_eds
WITH
(
    LOCATION = 's3://10.199.40.235:9000/movies',
    CREDENTIAL = s3_dsc
);
GO

SELECT * FROM OPENROWSET(
    BULK (
        '/decades/1950s/*.parquet',
        '/decades/1960s/*.parquet',
        '/decades/1970s/*.parquet'
    ),
    FORMAT = 'PARQUET',
    DATA_SOURCE = 's3_eds'
) AS data;

J. Uzyskiwanie dostępu do kilku tabel delty z usługi Azure Data Lake Gen2 przy użyciu zestawu OPENROWSET

Dotyczy: SQL Server 2022 (16.x) i nowszych wersjach.

W tym przykładzie kontener tabeli danych nosi nazwę Contosoi znajduje się na koncie magazynu usługi Azure Data Lake Gen2.

CREATE DATABASE SCOPED CREDENTIAL delta_storage_dsc
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '<SAS Token>';

CREATE EXTERNAL DATA SOURCE Delta_ED
WITH (
    LOCATION = 'adls://<container>@<storage_account>.dfs.core.windows.net',
    CREDENTIAL = delta_storage_dsc
);

SELECT *
FROM OPENROWSET(
    BULK '/Contoso',
    FORMAT = 'DELTA',
    DATA_SOURCE = 'Delta_ED'
) AS result;

K. Używanie zestawu danych OPENROWSET do wykonywania zapytań dotyczących publicznego anonimowego zestawu danych

W poniższym przykładzie użyto publicznie dostępnej publicznie żółtej podróży taksówką rekordy otwierania zestawu danych.

Najpierw utwórz źródło danych:

CREATE EXTERNAL DATA SOURCE NYCTaxiExternalDataSource
WITH (LOCATION = 'abs://nyctlc@azureopendatastorage.blob.core.windows.net');

Wykonaj zapytanie dotyczące wszystkich plików z .parquet rozszerzeniem w folderach pasujących do wzorca nazwy:

SELECT TOP 10 *
FROM OPENROWSET(
 BULK 'yellow/puYear=*/puMonth=*/*.parquet',
 DATA_SOURCE = 'NYCTaxiExternalDataSource',
 FORMAT = 'parquet'
) AS filerows;

A. Odczytywanie pliku parquet z usługi Azure Blob Storage

W poniższym przykładzie przedstawiono sposób odczytywania 100 wierszy z pliku Parquet:

SELECT TOP 100 * 
FROM OPENROWSET(
    BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet'
);

B. Odczytywanie niestandardowego pliku CSV

W poniższym przykładzie widać, jak odczytywać wiersze z pliku CSV z wierszem nagłówka i jawnie określonymi znakami terminatora oddzielającym wiersze i pola:

SELECT *
FROM OPENROWSET(
BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv',
 HEADER_ROW = TRUE,
 ROW_TERMINATOR = '\n',
 FIELD_TERMINATOR = ',');

C. Określanie schematu kolumny pliku podczas odczytywania pliku

W poniższym przykładzie pokazano, jak jawnie określić schemat wiersza, który zostanie zwrócony w wyniku OPENROWSET funkcji:

SELECT *
FROM OPENROWSET(
BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet') 
WITH (
        updated DATE
        ,confirmed INT
        ,deaths INT
        ,iso2 VARCHAR(8000)
        ,iso3 VARCHAR(8000)
        );

D. Odczytywanie partycjonowanych zestawów danych

W poniższym przykładzie można zobaczyć, jak używać funkcji filepath() do odczytywania części identyfikatora URI ze dopasowanej ścieżki pliku:

SELECT TOP 10 
  files.filepath(2) AS area
, files.*
FROM OPENROWSET(
BULK 'https://<storage account>.blob.core.windows.net/public/NYC_Property_Sales_Dataset/*_*.csv',
 HEADER_ROW = TRUE) 
AS files
WHERE files.filepath(1) = '2009';

E. Określanie schematu kolumny pliku podczas odczytywania pliku JSONL

W poniższym przykładzie można zobaczyć, jak jawnie określić schemat wiersza, który zostanie zwrócony w wyniku OPENROWSET funkcji:

SELECT TOP 10 *
FROM OPENROWSET(
BULK 'https://pandemicdatalake.dfs.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.jsonl') 
WITH (
        country_region varchar(50),
        date DATE '$.updated',
        cases INT '$.confirmed',
        fatal_cases INT '$.deaths'
     );

Jeśli nazwa kolumny nie jest zgodna z fizyczną nazwą kolumny we właściwościach, jeśli plik JSONL, możesz określić nazwę fizyczną w ścieżce JSON po definicji typu. Można użyć wielu właściwości. Aby na przykład $.location.latitude odwołać się do zagnieżdżonych właściwości w typach złożonych parquet lub obiektach podrzędnych JSON.

Więcej przykładów

A. Użyj OPENROWSET, aby odczytać plik CSV z Fabric Lakehouse

W tym przykładzie będzie używany do OPENROWSET odczytu pliku CSV dostępnego na Fabric Lakehouse, nazwanego customer.csv, przechowywanego w folderze Files/Contoso/ . Ponieważ nie są udostępniane dane dotyczące źródeł danych ani danych danych o ograniczonym zakresie, baza danych Fabric SQL uwierzytelnia się za pomocą kontekstu Entra ID użytkownika.

SELECT * FROM OPENROWSET 
( BULK ' abfss://<workspace id>@<tenant>.dfs.fabric.microsoft.com/<lakehouseid>/Files/Contoso/customer.csv' 
, FORMAT = 'CSV' 
, FIRST_ROW = 2 
) WITH 
(  
    CustomerKey INT,  
    GeoAreaKey INT,  
    StartDT DATETIME2,  
    EndDT DATETIME2,  
    Continent NVARCHAR(50),  
    Gender NVARCHAR(10),  
    Title NVARCHAR(10),  
    GivenName NVARCHAR(100),  
    MiddleInitial VARCHAR(2),  
    Surname NVARCHAR(100),  
    StreetAddress NVARCHAR(200),  
    City NVARCHAR(100),  
    State NVARCHAR(100),  
    StateFull NVARCHAR(100),  
    ZipCode NVARCHAR(20),  
    Country_Region NCHAR(2),  
    CountryFull NVARCHAR(100),  
    Birthday DATETIME2,  
    Age INT,  
    Occupation NVARCHAR(100),  
    Company NVARCHAR(100),  
    Vehicle NVARCHAR(100),  
    Latitude DECIMAL(10,6),  
    Longitude DECIMAL(10,6) ) AS DATA 

B. Użyj OPENROWSET, aby odczytać plik z Fabric Lakehouse i wstawić go do nowej tabeli

W tym przykładzie najpierw zostanie użyte OPENROWSET do odczytu danych z pliku parkietu ostore.parquet nazwie . INSERT Następnie dane trafiają do nowej tabeli o nazwie Store. Plik parquet znajduje się w Fabric Lakehouse, ponieważ nie ma żadnych DATA_SOURCE ani danych, baza SQL w Fabric uwierzytelnia się za pomocą kontekstu Entra ID użytkownika.

SELECT * 
FROM OPENROWSET 
(BULK 'abfss://<workspace id>@<tenant>.dfs.fabric.microsoft.com/<lakehouseid>/Files/Contoso/store.parquet' 
, FORMAT = 'parquet' )
 AS dataset; 

-- insert into new table 
SELECT * 
INTO Store 
FROM OPENROWSET 
(BULK 'abfss://<workspace id>@<tenant>.dfs.fabric.microsoft.com/<lakehouseid>/Files/Contoso/store.parquet' 
, FORMAT = 'parquet' ) 
 AS STORE; 

Więcej przykładów

Aby uzyskać więcej przykładów pokazujących korzystanie z OPENROWSET(BULK...), zobacz następujące artykuły: