Delen via


CREATE EXTERNAL TABLE AS SELECT (CETAS) (Transact-SQL)

Van toepassing op: SQL Server 2022 (16.x) en hoger Azure Synapse AnalyticsAnalytics Platform System (PDW)

Hiermee maakt u een externe tabel en exporteert u vervolgens parallel de resultaten van een Transact-SQL SELECT-instructie.

  • Azure Synapse Analytics and Analytics Platform System biedt ondersteuning voor Hadoop- of Azure Blob Storage.
  • SQL Server 2022 (16.x) en latere versies ondersteunen CREATE EXTERNAL TABLE AS SELECT (CETAS) voor het maken van een externe tabel en exporteren, parallel, het resultaat van een Transact-SQL SELECT-instructie naar Azure Data Lake Storage (ADLS) Gen2, Azure Storage Account V2 en S3-compatibele objectopslag.

Notitie

De mogelijkheden en beveiliging van CETAS voor Azure SQL Managed Instance verschillen van SQL Server of Azure Synapse Analytics. Zie de azure SQL Managed Instance-versie van CREATE EXTERNAL TABLE AS SELECTvoor meer informatie.

Notitie

De mogelijkheden en beveiliging van CETAS voor serverloze pools in Azure Synapse Analytics verschillen van SQL Server. Zie CETAS met Synapse SQLvoor meer informatie.

Transact-SQL syntaxisconventies

Syntaxis

CREATE EXTERNAL TABLE { [ [ database_name . [ schema_name ] . ] | schema_name . ] table_name }
    [ (column_name [ , ...n ] ) ]
    WITH (
        LOCATION = 'hdfs_folder' | '<prefix>://<path>[:<port>]' ,
        DATA_SOURCE = external_data_source_name ,
        FILE_FORMAT = external_file_format_name
        [ , <reject_options> [ , ...n ] ]
    )
    AS <select_statement>
[;]

<reject_options> ::=
{
    | REJECT_TYPE = value | percentage
    | REJECT_VALUE = reject_value
    | REJECT_SAMPLE_VALUE = reject_sample_value
}

<select_statement> ::=
    [ WITH <common_table_expression> [ , ...n ] ]
    SELECT <select_criteria>

Argumenten

[ [ database_name . [ schema_name ] . ] | schema_name . ] table_name

De een- tot driedelige naam van de tabel die u in de database wilt maken. Voor een externe tabel slaat relationele database alleen de metagegevens van de tabel op.

[ ( column_name [ ,... n ] ) ]

De naam van een tabelkolom.

PLAATS

Van toepassing op: Azure Synapse Analytics en Analytics Platform System

'hdfs_folder'**
Hiermee geeft u op waar de resultaten van de SELECT-instructie op de externe gegevensbron moeten worden geschreven. De locatie is een mapnaam en kan eventueel een pad bevatten dat relatief is ten opzichte van de hoofdmap van het Hadoop-cluster of blobopslag. PolyBase maakt het pad en de map als het nog niet bestaat.

De externe bestanden worden geschreven naar hdfs_folder en benoemd QueryID_date_time_ID.format, waarbij ID een incrementele id is en format de geëxporteerde gegevensindeling is. Een voorbeeld is QID776_20160130_182739_0.orc.

LOCATION moet verwijzen naar een map en een volg-/hebben, bijvoorbeeld: aggregated_data/.

Van toepassing op: SQL Server 2022 (16.x) en hoger

prefix://path[:port] biedt het connectiviteitsprotocol (voorvoegsel), het pad en eventueel de poort naar de externe gegevensbron, waar het resultaat van de SELECT-instructie wordt geschreven.

Als de bestemming S3-compatibele objectopslag is, moet er eerst een bucket bestaan, maar PolyBase kan indien nodig submappen maken. SQL Server 2022 (16.x) ondersteunt Azure Data Lake Storage Gen2, Azure Storage Account V2 en S3-compatibele objectopslag. ORC-bestanden worden momenteel niet ondersteund.

DATA_SOURCE = external_data_source_name

Hiermee geeft u de naam op van het externe gegevensbronobject dat de locatie bevat waar de externe gegevens worden opgeslagen of worden opgeslagen. De locatie is een Hadoop-cluster of een Azure Blob-opslag. Als u een externe gegevensbron wilt maken, gebruikt u CREATE EXTERNAL DATA SOURCE (Transact-SQL).

FILE_FORMAT = external_file_format_name

Hiermee geeft u de naam van het externe bestandsindelingsobject dat de indeling voor het externe gegevensbestand bevat. Als u een externe bestandsindeling wilt maken, gebruikt u CREATE EXTERNAL FILE FORMAT (Transact-SQL).

WEIGERINGsopties

WEIGEREN-opties zijn niet van toepassing op het moment dat deze CREATE EXTERNAL TABLE AS SELECT instructie wordt uitgevoerd. In plaats daarvan worden ze hier opgegeven, zodat de database deze op een later tijdstip kan gebruiken wanneer er gegevens uit de externe tabel worden geïmporteerd. Later, wanneer de instructie CREATE TABLE AS SELECT gegevens uit de externe tabel selecteert, gebruikt de database de weigeringsopties om het aantal of het percentage rijen te bepalen dat niet kan worden geïmporteerd voordat het importeren wordt gestopt.

  • REJECT_VALUE = reject_value

    Hiermee geeft u de waarde of het percentage rijen op dat niet kan worden geïmporteerd voordat de database de import stopt.

  • REJECT_TYPE = waarde | percentage

    Verduidelijkt of de optie REJECT_VALUE een letterlijke waarde of een percentage is.

    • waarde

      Wordt gebruikt als REJECT_VALUE een letterlijke waarde is, niet een percentage. De database stopt met het importeren van rijen uit het externe gegevensbestand wanneer het aantal mislukte rijen groter is dan reject_value.

      Als bijvoorbeeld REJECT_VALUE = 5 en REJECT_TYPE = value, stopt de database met het importeren van rijen nadat vijf rijen niet kunnen worden geïmporteerd.

    • percentage

      Wordt gebruikt als REJECT_VALUE een percentage is, niet een letterlijke waarde. De database stopt met het importeren van rijen uit het externe gegevensbestand wanneer het percentage van mislukte rijen groter is dan reject_value. Het percentage mislukte rijen wordt berekend met intervallen. Alleen geldig in toegewezen SQL-pools wanneer TYPE=HADOOP.

  • REJECT_SAMPLE_VALUE = reject_sample_value

    Vereist wanneer REJECT_TYPE = percentage. Hiermee geeft u het aantal rijen op dat moet worden geïmporteerd voordat de database het percentage mislukte rijen opnieuw berekent.

    Als bijvoorbeeld REJECT_SAMPLE_VALUE = 1000, berekent de database het percentage mislukte rijen nadat is geprobeerd 1000 rijen uit het externe gegevensbestand te importeren. Als het percentage mislukte rijen kleiner is dan reject_value, probeert de database nog eens 1000 rijen te laden. De database blijft het percentage mislukte rijen herberekenen nadat deze elke extra 1000 rijen heeft geïmporteerd.

    Notitie

    Omdat de database het percentage mislukte rijen berekent met intervallen, kan het werkelijke percentage mislukte rijen groter zijn dan reject_value.

    voorbeeld:

    In dit voorbeeld ziet u hoe de drie weigeringsopties met elkaar communiceren. Als REJECT_TYPE = percentage, REJECT_VALUE = 30, REJECT_SAMPLE_VALUE = 100, kan het volgende scenario bijvoorbeeld optreden:

    • De database probeert de eerste 100 rijen te laden, waarvan 25 mislukken en 75 slagen.
    • Het percentage mislukte rijen wordt berekend als 25%, wat kleiner is dan de weigeringswaarde van 30%. Het is dus niet nodig om de belasting te stoppen.
    • De database probeert de volgende 100 rijen te laden. Deze keer slagen 25 en 75 mislukt.
    • Het percentage mislukte rijen wordt opnieuw berekend als 50%. Het percentage mislukte rijen heeft de waarde van 30% weigeren overschreden.
    • De belasting mislukt met 50% mislukte rijen na een poging om 200 rijen te laden, wat groter is dan de opgegeven limiet van 30%.

MET common_table_expression

Hiermee geeft u een tijdelijke benoemde resultatenset op, ook wel een algemene tabelexpressie (CTE) genoemd. Zie WITH common_table_expression (Transact-SQL) voor meer informatie

SELECT <select_criteria>

Hiermee wordt de nieuwe tabel gevuld met de resultaten van een SELECT-instructie. select_criteria is de hoofdtekst van de SELECT-instructie waarmee wordt bepaald welke gegevens naar de nieuwe tabel moeten worden gekopieerd. Zie SELECT (Transact-SQL)voor meer informatie over SELECT-instructies.

Notitie

ORDER BY-component in SELECT heeft geen effect op CETAS.

kolomopties

  • column_name [ ,... n ]

    Kolomnamen staan de kolomopties die worden vermeld in CREATE TABLE niet toe. In plaats daarvan kunt u een optionele lijst opgeven met een of meer kolomnamen voor de nieuwe tabel. De kolommen in de nieuwe tabel gebruiken de namen die u opgeeft. Wanneer u kolomnamen opgeeft, moet het aantal kolommen in de kolomlijst overeenkomen met het aantal kolommen in de selectieresultaten. Als u geen kolomnamen opgeeft, worden in de nieuwe doeltabel de kolomnamen in de resultaten van de select-instructie gebruikt.

    U kunt geen andere kolomopties opgeven, zoals gegevenstypen, sortering of null-uitvoerbaarheid. Elk van deze kenmerken is afgeleid van de resultaten van de SELECT-instructie. U kunt echter de SELECT-instructie gebruiken om de kenmerken te wijzigen. Zie voor een voorbeeld CETAS gebruiken om kolomkenmerken te wijzigen.

Machtigingen

Als u deze opdracht wilt uitvoeren, heeft de databasegebruiker al deze machtigingen of lidmaatschappen nodig:

  • ALTER SCHEMA machtiging voor het lokale schema dat de nieuwe tabel of het lidmaatschap van de db_ddladmin vaste databaserol bevat.
  • CREATE TABLE machtiging of lidmaatschap van de db_ddladmin vaste databaserol.
  • SELECT machtiging voor objecten waarnaar in de select_criteriawordt verwezen.

Voor de aanmelding zijn al deze machtigingen vereist:

  • BULKBEWERKINGEN BEHEREN
  • EEN EXTERNE GEGEVENSBRON WIJZIGEN
  • EEN EXTERNE BESTANDSINDELING WIJZIGEN
  • Over het algemeen moet u machtigingen hebben voor het mapinhoud van lijst en schrijven naar de map LOCATION voor CETAS.
  • In Azure Synapse Analytics en Analytics Platform System Schrijf machtiging schrijven voor lezen en schrijven naar de externe map op het Hadoop-cluster of in Azure Blob Storage.
  • In SQL Server 2022 (16.x) is het ook vereist om de juiste machtigingen in te stellen op de externe locatie. Machtiging schrijven om de gegevens naar de locatie uit te voeren en leesmachtiging om deze te openen.
  • Voor Azure Blob Storage en Azure Data Lake Gen2 moet het SHARED ACCESS SIGNATURE token de volgende bevoegdheden krijgen voor de container: Read, Write, List, Create.
  • Voor Azure Blog Storage moet het selectievakje Allowed Services: Blob zijn ingeschakeld om het SAS-token te genereren.
  • Voor Azure Data Lake Gen2 moet de Allowed Services: Container en Object selectievakjes zijn ingeschakeld om het SAS-token te genereren.

Belangrijk

Met de machtiging ALTER ANY EXTERNAL DATA SOURCE verleent elke principal de mogelijkheid om een extern gegevensbronobject te maken en te wijzigen, zodat het ook de mogelijkheid verleent om toegang te krijgen tot alle databasereferenties in de database. Deze machtiging moet worden beschouwd als zeer bevoegd en moet alleen worden verleend aan vertrouwde principals in het systeem.

Foutafhandeling

Wanneer CREATE EXTERNAL TABLE AS SELECT gegevens exporteert naar een bestand met tekstscheidingstekens, is er geen afwijzingsbestand voor rijen die niet kunnen worden geëxporteerd.

Wanneer u de externe tabel maakt, probeert de database verbinding te maken met de externe locatie. Als de verbinding mislukt, mislukt de opdracht en wordt de externe tabel niet gemaakt. Het kan een minuut of langer duren voordat de opdracht mislukt omdat de database de verbinding minstens drie keer opnieuw probeert uit te voeren.

Als CREATE EXTERNAL TABLE AS SELECT wordt geannuleerd of mislukt, voert de database een eenmalige poging uit om nieuwe bestanden en mappen te verwijderen die al zijn gemaakt op de externe gegevensbron.

In Azure Synapse Analytics en Analytics Platform System rapporteert de database eventuele Java-fouten die optreden in de externe gegevensbron tijdens het exporteren van gegevens.

Opmerkingen

Nadat de CREATE EXTERNAL TABLE AS SELECT-instructie is voltooid, kunt u Transact-SQL query's uitvoeren in de externe tabel. Met deze bewerkingen worden gegevens geïmporteerd in de database voor de duur van de query, tenzij u importeert met behulp van de instructie CREATE TABLE AS SELECT.

De naam en definitie van de externe tabel worden opgeslagen in de metagegevens van de database. De gegevens worden opgeslagen in de externe gegevensbron.

Met de instructie CREATE EXTERNAL TABLE AS SELECT wordt altijd een niet-gepartitioneerde tabel gemaakt, zelfs als de brontabel is gepartitioneerd.

Voor SQL Server 2022 (16.x) moet de optie allow polybase export zijn ingeschakeld met behulp van sp_configure. Zie configuratieoptie allow polybase export instellenvoor meer informatie.

Voor queryplannen in Azure Synapse Analytics en Analytics Platform System, gemaakt met EXPLAIN, maakt de database gebruik van deze queryplanbewerkingen voor externe tabellen: Externe willekeurige verplaatsing, externe broadcast verplaatsen, externe partitieverplaatsing.

Als vereiste voor het maken van een externe tabel in Analytics Platform System moet de apparaatbeheerder Hadoop-connectiviteit configureren. Zie Connectiviteit met externe gegevens (Analytics Platform System) configureren in de documentatie van het Analytics Platform System, die u kunt downloaden via het Microsoft Downloadcentrumvoor meer informatie.

Beperkingen en beperkingen

Omdat externe tabelgegevens zich buiten de database bevinden, werken back-up- en herstelbewerkingen alleen op gegevens die zijn opgeslagen in de database. Als gevolg hiervan wordt alleen een back-up van de metagegevens gemaakt en hersteld.

De database controleert de verbinding met de externe gegevensbron niet bij het herstellen van een databaseback-up die een externe tabel bevat. Als de oorspronkelijke bron niet toegankelijk is, slaagt het herstellen van metagegevens van de externe tabel nog steeds, maar mislukt SELECT-bewerkingen in de externe tabel.

De database garandeert geen gegevensconsistentie tussen de database en de externe gegevens. U, de klant, is alleen verantwoordelijk voor het onderhouden van consistentie tussen de externe gegevens en de database.

DML-bewerkingen (Data Manipulat Language) worden niet ondersteund in externe tabellen. U kunt bijvoorbeeld de Transact-SQL-instructies voor het bijwerken, invoegen of verwijderen van Transact-SQL niet gebruiken om de externe gegevens te wijzigen.

CREATE TABLE, DROP TABLE, CREATE STATISTICS, DROP STATISTICS, CREATE VIEW en DROP VIEW zijn de enige DDL-bewerkingen (Data Definition Language) die zijn toegestaan voor externe tabellen.

Beperkingen en beperkingen voor Azure Synapse Analytics

  • In toegewezen SQL-pools van Azure Synapse Analytics en het Analytics Platform System kan PolyBase maximaal 33.000 bestanden per map gebruiken bij het uitvoeren van 32 gelijktijdige PolyBase-query's. Dit maximumaantal omvat zowel bestanden als submappen in elke HDFS-map. Als de mate van gelijktijdigheid kleiner is dan 32, kan een gebruiker PolyBase-query's uitvoeren op mappen in HDFS die meer dan 33.000 bestanden bevatten. Het is raadzaam dat gebruikers van Hadoop en PolyBase bestandspaden kort houden en niet meer dan 30.000 bestanden per HDFS-map gebruiken. Wanneer er te veel bestanden naar worden verwezen, treedt er een JVM-uitzondering op voor onvoldoende geheugen.

  • In serverloze SQL-pools kunnen externe tabellen niet worden gemaakt op een locatie waar u momenteel gegevens hebt. Als u een locatie wilt hergebruiken die is gebruikt voor het opslaan van gegevens, moet de locatie handmatig worden verwijderd in ADLS. Zie Best practices voor filteroptimalisatievoor meer beperkingen en best practices.

Wanneer in toegewezen SQL-pools van Azure Synapse Analytics en Analytics Platform System CREATE EXTERNAL TABLE AS SELECT uit een RCFile selecteert, mogen de kolomwaarden in het RCFile het sluisteken (|) niet bevatten.

SET ROWCOUNT (Transact-SQL) heeft geen effect op CREATE EXTERNAL TABLE AS SELECT. Gebruik TOP (Transact-SQL)om een vergelijkbaar gedrag te bereiken.

Bekijk naamgeving en verwijzingen naar containers, blobs en metagegevens voor beperkingen voor bestandsnamen.

Tekenfouten

De volgende tekens in gegevens kunnen fouten veroorzaken, waaronder geweigerde records met CREATE EXTERNAL TABLE AS SELECT naar Parquet-bestanden.

Dit geldt ook voor ORC-bestanden in Azure Synapse Analytics en Analytics Platform System.

  • |
  • " (aanhalingsteken)
  • \r\n
  • \r
  • \n

Als u CREATE EXTERNAL TABLE AS SELECT met deze tekens wilt gebruiken, moet u eerst de CREATE EXTERNAL TABLE AS SELECT instructie uitvoeren om de gegevens te exporteren naar tekstbestanden met scheidingstekens, waar u ze vervolgens kunt converteren naar Parquet of ORC met behulp van een extern hulpprogramma.

Werken met parquet

Wanneer u met parquet-bestanden werkt, genereert CREATE EXTERNAL TABLE AS SELECT één parquet-bestand per beschikbare CPU, tot aan de geconfigureerde maximale mate van parallelle uitvoering (MAXDOP). Elk bestand kan groeien tot 190 GB, waarna SQL Server meer Parquet-bestanden genereert, indien nodig.

De queryhint OPTION (MAXDOP n) heeft alleen invloed op het SELECT-deel van CREATE EXTERNAL TABLE AS SELECT. Het heeft geen invloed op het aantal Parquet-bestanden. Alleen MAXDOP op databaseniveau en MAXDOP op exemplaarniveau wordt overwogen.

Vergrendeling

Neemt een gedeelde vergrendeling op het OBJECT SCHEMARESOLUTION.

Ondersteunde gegevenstypen

CETAS kan worden gebruikt om resultatensets op te slaan met de volgende SQL-gegevenstypen:

  • binair
  • varbinary
  • verkolen
  • varchar
  • nchar
  • nvarchar
  • smalldate
  • datum
  • datum/tijd
  • datetime2
  • datetimeoffset
  • Tijd
  • decimaal
  • numeriek
  • drijven
  • werkelijk
  • bigint
  • tinyint
  • smallint
  • Int
  • bigint
  • bit
  • geld
  • smallmoney

Voorbeelden

Een. Een Hadoop-tabel maken met CREATE EXTERNAL TABLE AS SELECT

Van toepassing op: Azure Synapse Analytics en Analytics Platform System

In het volgende voorbeeld wordt een nieuwe externe tabel gemaakt met de naam hdfsCustomer die gebruikmaakt van de kolomdefinities en gegevens uit de brontabel dimCustomer.

De tabeldefinitie wordt opgeslagen in de database en de resultaten van de SELECT-instructie worden geëxporteerd naar het /pdwdata/customer.tbl bestand op de externe Hadoop-gegevensbron customer_ds. Het bestand is opgemaakt volgens de externe bestandsindeling customer_ff.

De bestandsnaam wordt gegenereerd door de database en bevat de query-id om het bestand gemakkelijker uit te lijnen met de query die het heeft gegenereerd.

Het pad hdfs://xxx.xxx.xxx.xxx:5000/files/ voorafgaande aan de directory Klant moet al bestaan. Als de map Klant niet bestaat, maakt de database de map.

Notitie

In dit voorbeeld wordt 5000 opgegeven. Als de poort niet is opgegeven, gebruikt de database 8020 als standaardpoort.

De resulterende Hadoop-locatie en bestandsnaam worden hdfs:// xxx.xxx.xxx.xxx:5000/files/Customer/ QueryID_YearMonthDay_HourMinutesSeconds_FileIndex.txt..

-- Example is based on AdventureWorks
CREATE EXTERNAL TABLE hdfsCustomer
    WITH (
            LOCATION = '/pdwdata/customer.tbl',
            DATA_SOURCE = customer_ds,
            FILE_FORMAT = customer_ff
            ) AS

SELECT *
FROM dimCustomer;
GO

B. Een queryhint gebruiken met CREATE EXTERNAL TABLE AS SELECT

Van toepassing op: Azure Synapse Analytics en Analytics Platform System

Deze query toont de basissyntaxis voor het gebruik van een hint voor querydeelname met de instructie CREATE EXTERNAL TABLE AS SELECT. Nadat de query is verzonden, gebruikt de database de hash-joinstrategie om het queryplan te genereren. Zie OPTION-component (Transact-SQL)voor meer informatie over hints voor joins en het gebruik van de OPTION-component.

Notitie

In dit voorbeeld wordt 5000 opgegeven. Als de poort niet is opgegeven, gebruikt de database 8020 als standaardpoort.

-- Example is based on AdventureWorks
CREATE EXTERNAL TABLE dbo.FactInternetSalesNew
    WITH (
            LOCATION = '/files/Customer',
            DATA_SOURCE = customer_ds,
            FILE_FORMAT = customer_ff
            ) AS

SELECT T1.*
FROM dbo.FactInternetSales T1
INNER JOIN dbo.DimCustomer T2
    ON (T1.CustomerKey = T2.CustomerKey)
OPTION (HASH JOIN);
GO

C. CETAS gebruiken om kolomkenmerken te wijzigen

Van toepassing op: Azure Synapse Analytics en Analytics Platform System

In dit voorbeeld wordt CETAS gebruikt om gegevenstypen, nullbaarheid en sortering te wijzigen voor verschillende kolommen in de FactInternetSales tabel.

-- Example is based on AdventureWorks
CREATE EXTERNAL TABLE dbo.FactInternetSalesNew
    WITH (
            LOCATION = '/files/Customer',
            DATA_SOURCE = customer_ds,
            FILE_FORMAT = customer_ff
            ) AS

SELECT T1.ProductKey AS ProductKeyNoChange,
    T1.OrderDateKey AS OrderDate,
    T1.ShipDateKey AS ShipDate,
    T1.CustomerKey AS CustomerKeyNoChange,
    T1.OrderQuantity AS Quantity,
    T1.SalesAmount AS MONEY
FROM dbo.FactInternetSales T1
INNER JOIN dbo.DimCustomer T2
    ON (T1.CustomerKey = T2.CustomerKey)
OPTION (HASH JOIN);
GO

D. CREATE EXTERNAL TABLE AS SELECT gebruiken om gegevens als Parquet te exporteren

van toepassing op: SQL Server 2022 (16.x)

In het volgende voorbeeld wordt een nieuwe externe tabel gemaakt met de naam ext_sales die gebruikmaakt van de gegevens uit de tabel SalesOrderDetail van AdventureWorks2022. De de configuratieoptie voor het exporteren van polybase toestaan moet zijn ingeschakeld.

Het resultaat van de SELECT-instructie wordt opgeslagen op S3-compatibele objectopslag die eerder is geconfigureerd en benoemd s3_eds, en de juiste referenties die zijn gemaakt als s3_dsc. De parquet-bestandslocatie wordt <ip>:<port>/cetas/sales.parquet waar cetas de eerder gemaakte opslagbucket is.

Notitie

Delta-indeling wordt momenteel alleen ondersteund als alleen-lezen.

-- Credential to access the S3-compatible object storage
CREATE DATABASE SCOPED CREDENTIAL s3_dsc
    WITH IDENTITY = 'S3 Access Key',
        SECRET = '<accesskeyid>:<secretkeyid>'
GO

-- S3-compatible object storage data source
CREATE EXTERNAL DATA SOURCE s3_eds
    WITH (
            LOCATION = 's3://<ip>:<port>',
            CREDENTIAL = s3_dsc
            )

-- External File Format for PARQUET
CREATE EXTERNAL FILE FORMAT ParquetFileFormat
    WITH (FORMAT_TYPE = PARQUET);
GO

CREATE EXTERNAL TABLE ext_sales
    WITH (
            LOCATION = '/cetas/sales.parquet',
            DATA_SOURCE = s3_eds,
            FILE_FORMAT = ParquetFileFormat
            ) AS

SELECT *
FROM AdventureWorks2022.[Sales].[SalesOrderDetail];
GO

E. CREATE EXTERNAL TABLE AS SELECT van deltatabel naar Parquet gebruiken

van toepassing op: SQL Server 2022 (16.x)

In het volgende voorbeeld wordt een nieuwe externe tabel gemaakt met de naam Delta_to_Parquet, die gebruikmaakt van het deltatabeltype gegevens in een S3-compatibele objectopslag met de naam s3_deltaen schrijft het resultaat in een andere gegevensbron met de naam s3_parquet als parquet-bestand. Hiervoor maakt het voorbeeld gebruik van de OPENROWSET-opdracht. De de configuratieoptie voor het exporteren van polybase toestaan moet zijn ingeschakeld.

-- External File Format for PARQUET
CREATE EXTERNAL FILE FORMAT ParquetFileFormat
    WITH (FORMAT_TYPE = PARQUET);
GO

CREATE EXTERNAL TABLE Delta_to_Parquet
    WITH (
            LOCATION = '/backup/sales.parquet',
            DATA_SOURCE = s3_parquet,
            FILE_FORMAT = ParquetFileFormat
            ) AS

SELECT *
FROM OPENROWSET(BULK '/delta/sales_fy22/', FORMAT = 'DELTA', DATA_SOURCE = 's3_delta') AS [r];
GO

F. CREATE EXTERNAL TABLE AS SELECT gebruiken met een weergave als de bron

van toepassing op: serverloze SQL-pools en toegewezen SQL-pools van Azure Synapse Analytics.

Gebruik het volgende voorbeeld als sjabloon voor het schrijven van CETAS met een door de gebruiker gedefinieerde weergave als bron, met behulp van een beheerde identiteit voor verificatie en het abfs:-eindpunt:

CREATE DATABASE [<mydatabase>];
GO

USE [<mydatabase>];
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';

CREATE DATABASE SCOPED CREDENTIAL [WorkspaceIdentity] WITH IDENTITY = 'managed identity';
GO

CREATE EXTERNAL FILE FORMAT [ParquetFF] WITH (
    FORMAT_TYPE = PARQUET,
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
GO

CREATE EXTERNAL DATA SOURCE [SynapseSQLwriteable] WITH (
    LOCATION = 'abfs[s]://<file_system>@<account_name>.dfs.core.windows.net/<path>/<file_name>',
    CREDENTIAL = [WorkspaceIdentity]
);
GO

CREATE EXTERNAL TABLE [dbo].[<myexternaltable>] WITH (
        LOCATION = '<myoutputsubfolder>/',
        DATA_SOURCE = [SynapseSQLwriteable],
        FILE_FORMAT = [ParquetFF]
) AS
SELECT * FROM [<myview>];
GO

G. CREATE EXTERNAL TABLE AS SELECT gebruiken met een weergave als de bron

van toepassing op: serverloze SQL-pools en toegewezen SQL-pools van Azure Synapse Analytics.

In dit voorbeeld zien we een voorbeeld van een sjablooncode voor het schrijven van CETAS met een door de gebruiker gedefinieerde weergave als bron, met behulp van beheerde identiteit als verificatie en https:.

CREATE DATABASE [<mydatabase>];
GO

USE [<mydatabase>];
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';

CREATE DATABASE SCOPED CREDENTIAL [WorkspaceIdentity] WITH IDENTITY = 'managed identity';
GO

CREATE EXTERNAL FILE FORMAT [ParquetFF] WITH (
    FORMAT_TYPE = PARQUET,
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
GO

CREATE EXTERNAL DATA SOURCE [SynapseSQLwriteable] WITH (
    LOCATION = 'https://<mystoageaccount>.dfs.core.windows.net/<mycontainer>/<mybaseoutputfolderpath>',
    CREDENTIAL = [WorkspaceIdentity]
);
GO

CREATE EXTERNAL TABLE [dbo].[<myexternaltable>] WITH (
        LOCATION = '<myoutputsubfolder>/',
        DATA_SOURCE = [SynapseSQLwriteable],
        FILE_FORMAT = [ParquetFF]
) AS
SELECT * FROM [<myview>];
GO

Volgende stappen

van toepassing op:Azure SQL Managed Instance

Hiermee maakt u een externe tabel en exporteert u vervolgens parallel de resultaten van een Transact-SQL SELECT-instructie.

U kunt CREATE EXTERNAL TABLE AS SELECT (CETAS) gebruiken om de volgende taken uit te voeren:

  • Maak een externe tabel boven op Parquet- of CSV-bestanden in Azure Blob Storage of Azure Data Lake Storage (ADLS) Gen2.
  • Exporteer parallel de resultaten van een T-SQL SELECT-instructie naar de gemaakte externe tabel.
  • Zie Gegevensvirtualisatie met Azure SQL Managed Instancevoor meer mogelijkheden voor gegevensvirtualisatie.

Notitie

Deze inhoud is alleen van toepassing op Azure SQL Managed Instance. Kies voor andere platforms de juiste versie van CREATE EXTERNAL TABLE AS SELECT in de vervolgkeuzelijst.

Transact-SQL syntaxisconventies

Syntaxis

CREATE EXTERNAL TABLE [ [database_name  . [ schema_name ] . ] | schema_name . ] table_name
    WITH (
        LOCATION = 'path_to_folder/',  
        DATA_SOURCE = external_data_source_name,  
        FILE_FORMAT = external_file_format_name
        [, PARTITION ( column_name [ , ...n ] ) ]
)
    AS <select_statement>  
[;]

<select_statement> ::=  
    [ WITH <common_table_expression> [ ,...n ] ]  
    SELECT <select_criteria>

Argumenten

[ [ database_name . [ schema_name ] . ] | schema_name . ] table_name

De naam van één tot drie delen van de tabel die u wilt maken. Voor een externe tabel worden alleen de metagegevens van de tabel opgeslagen. Er worden geen werkelijke gegevens verplaatst of opgeslagen.

LOCATION = 'path_to_folder'

Hiermee geeft u op waar de resultaten van de SELECT-instructie op de externe gegevensbron moeten worden geschreven. De hoofdmap is de gegevenslocatie die is opgegeven in de externe gegevensbron. LOCATION moet verwijzen naar een map en een afsluitende /hebben. Voorbeeld: aggregated_data/.

De doelmap voor de CETAS moet leeg zijn. Als het pad en de map nog niet bestaan, worden ze automatisch gemaakt.

DATA_SOURCE = external_data_source_name

Hiermee geeft u de naam op van het externe gegevensbronobject dat de locatie bevat waar de externe gegevens worden opgeslagen. Als u een externe gegevensbron wilt maken, gebruikt u CREATE EXTERNAL DATA SOURCE (Transact-SQL).

FILE_FORMAT = external_file_format_name

Hiermee geeft u de naam van het externe bestandsindelingsobject dat de indeling voor het externe gegevensbestand bevat. Als u een externe bestandsindeling wilt maken, gebruikt u CREATE EXTERNAL FILE FORMAT (Transact-SQL). Alleen externe bestandsindelingen met FORMAT_TYPE=PARQUET en FORMAT_TYPE=DELIMITEDTEXT worden momenteel ondersteund. GZip-compressie voor DELIMITEDTEXT-indeling wordt niet ondersteund.

[, PARTITION ( kolomnaam [ , ... n ] ) ]

Partitioneert de uitvoergegevens in meerdere parquet-bestandspaden. Partitionering vindt plaats per opgegeven kolommen (column_name), die overeenkomen met de jokertekens (*) in de locatie naar de respectieve partitioneringskolom. Het aantal kolommen in het gedeelte PARTITION moet overeenkomen met het aantal jokertekens in de LOCATIE. Er moet ten minste één kolom zijn die niet wordt gebruikt voor partitionering.

MET <common_table_expression>

Hiermee geeft u een tijdelijke benoemde resultatenset op, ook wel een algemene tabelexpressie (CTE) genoemd. Zie WITH common_table_expression (Transact-SQL)voor meer informatie.

SELECT <select_criteria>

Hiermee wordt de nieuwe tabel gevuld met de resultaten van een SELECT-instructie. select_criteria is de hoofdtekst van de SELECT-instructie waarmee wordt bepaald welke gegevens naar de nieuwe tabel moeten worden gekopieerd. Zie SELECT (Transact-SQL)voor meer informatie over SELECT-instructies.

Notitie

DE ORDER BY-component in SELECT wordt niet ondersteund voor CETAS.

Machtigingen

Machtigingen in opslag

U moet machtigingen hebben voor het weergeven van mapinhoud en schrijven naar het LOCATIE-pad om CETAS te laten werken.

Ondersteunde verificatiemethoden zijn beheerde identiteit of een SAS-token (Shared Access Signature).

  • Als u beheerde identiteit gebruikt voor verificatie, moet u ervoor zorgen dat de service-principal van uw met SQL beheerde exemplaar een rol heeft van Inzender voor opslagblobgegevens op de doelcontainer.
  • Als u een SAS-token gebruikt, lezen, schrijvenen lijst machtigingen zijn vereist.
  • Voor Azure Blog Storage moet het selectievakje Allowed Services: Blob zijn ingeschakeld om het SAS-token te genereren.
  • Voor Azure Data Lake Gen2 moet de Allowed Services: Container en Object selectievakjes zijn ingeschakeld om het SAS-token te genereren.

Een door de gebruiker toegewezen beheerde identiteit wordt niet ondersteund. Microsoft Entra Passthrough-verificatie wordt niet ondersteund. Microsoft Entra ID is (voorheen Azure Active Directory).

Machtigingen in het beheerde SQL-exemplaar

Als u deze opdracht wilt uitvoeren, heeft de databasegebruiker al deze machtigingen of lidmaatschappen nodig:

  • ALTER SCHEMA machtiging voor het lokale schema dat de nieuwe tabel of het lidmaatschap van de db_ddladmin vaste databaserol bevat.
  • CREATE TABLE machtiging of lidmaatschap van de db_ddladmin vaste databaserol.
  • SELECT machtiging voor objecten waarnaar in de select_criteriawordt verwezen.

Voor de aanmelding zijn al deze machtigingen vereist:

  • BULKBEWERKINGEN BEHEREN
  • EEN EXTERNE GEGEVENSBRON WIJZIGEN
  • EEN EXTERNE BESTANDSINDELING WIJZIGEN

Belangrijk

Met de machtiging ALTER ANY EXTERNAL DATA SOURCE verleent elke principal de mogelijkheid om een extern gegevensbronobject te maken en te wijzigen, zodat het ook de mogelijkheid verleent om toegang te krijgen tot alle databasereferenties in de database. Deze machtiging moet worden beschouwd als zeer bevoegd en moet alleen worden verleend aan vertrouwde principals in het systeem.

Ondersteunde gegevenstypen

CETAS slaat resultatensets op met de volgende SQL-gegevenstypen:

  • binair
  • varbinary
  • verkolen
  • varchar
  • nchar
  • nvarchar
  • smalldatetime
  • datum
  • datum/tijd
  • datetime2
  • datetimeoffset
  • Tijd
  • decimaal
  • numeriek
  • drijven
  • werkelijk
  • bigint
  • tinyint
  • smallint
  • Int
  • bigint
  • bit
  • geld
  • smallmoney

Notitie

LOBs die groter zijn dan 1 MB kunnen niet worden gebruikt met CETAS.

Beperkingen en beperkingen

  • CREATE EXTERNAL TABLE AS SELECT (CETAS) voor Azure SQL Managed Instance is standaard uitgeschakeld. Zie de volgende sectie Standaard uitgeschakeldvoor meer informatie.
  • Zie Beperkingen en bekende problemenvoor meer informatie over beperkingen of bekende problemen met gegevensvirtualisatie in Azure SQL Managed Instance.

Omdat externe tabelgegevens zich buiten de database bevinden, werken back-up- en herstelbewerkingen alleen op gegevens die zijn opgeslagen in de database. Als gevolg hiervan wordt alleen een back-up van de metagegevens gemaakt en hersteld.

De database controleert de verbinding met de externe gegevensbron niet bij het herstellen van een databaseback-up die een externe tabel bevat. Als de oorspronkelijke bron niet toegankelijk is, slaagt het herstellen van metagegevens van de externe tabel nog steeds, maar mislukt SELECT-bewerkingen in de externe tabel.

De database garandeert geen gegevensconsistentie tussen de database en de externe gegevens. U, de klant, is alleen verantwoordelijk voor het onderhouden van consistentie tussen de externe gegevens en de database.

DML-bewerkingen (Data Manipulat Language) worden niet ondersteund in externe tabellen. U kunt bijvoorbeeld de Transact-SQL bijwerken, invoegen of verwijderen Transact-SQLstatements niet gebruiken om de externe gegevens te wijzigen.

CREATE TABLE, DROP TABLE, CREATE STATISTICS, DROP STATISTICS, CREATE VIEW en DROP VIEW zijn de enige DDL-bewerkingen (Data Definition Language) die zijn toegestaan voor externe tabellen.

Externe tabellen kunnen niet worden gemaakt op een locatie waar u momenteel gegevens hebt. Als u een locatie wilt hergebruiken die is gebruikt voor het opslaan van gegevens, moet de locatie handmatig worden verwijderd in ADLS.

SET ROWCOUNT (Transact-SQL) heeft geen effect op CREATE EXTERNAL TABLE AS SELECT. Gebruik TOP (Transact-SQL)om een vergelijkbaar gedrag te bereiken.

Bekijk naamgeving en verwijzingen naar containers, blobs en metagegevens voor beperkingen voor bestandsnamen.

Opslagtypen

Bestanden kunnen worden opgeslagen in Azure Data Lake Storage Gen2 of Azure Blob Storage. Als u query's wilt uitvoeren op bestanden, moet u de locatie in een specifieke indeling opgeven en het locatietypevoorvoegsel gebruiken dat overeenkomt met het type externe bron en eindpunt/protocol, zoals de volgende voorbeelden:

--Blob Storage endpoint
abs://<container>@<storage_account>.blob.core.windows.net/<path>/<file_name>.parquet

--Data Lake endpoint
adls://<container>@<storage_account>.blob.core.windows.net/<path>/<file_name>.parquet

Belangrijk

Het opgegeven locatietypevoorvoegsel wordt gebruikt om het optimale protocol voor communicatie te kiezen en gebruik te maken van geavanceerde mogelijkheden die door het specifieke opslagtype worden geboden. Het algemene https:// voorvoegsel wordt uitgeschakeld. Gebruik altijd eindpuntspecifieke voorvoegsels.

Standaard uitgeschakeld

MET CREATE EXTERNAL TABLE AS SELECT (CETAS) kunt u gegevens uit uw met SQL beheerde exemplaar exporteren naar een extern opslagaccount, dus er is mogelijk voor gegevensexfiltratierisico's met deze mogelijkheden. CeTAS is daarom standaard uitgeschakeld voor Azure SQL Managed Instance.

CETAS inschakelen

CETAS voor Azure SQL Managed Instance kan alleen worden ingeschakeld via een methode waarvoor verhoogde Azure-machtigingen zijn vereist en die niet kan worden ingeschakeld via T-SQL. Vanwege het risico op niet-geautoriseerde gegevensexfiltratie kan CETAS niet worden ingeschakeld via de sp_configure opgeslagen T-SQL-procedure, maar vereist in plaats daarvan dat de gebruikersactie buiten het beheerde SQL-exemplaar valt.

Machtigingen voor het inschakelen van CETAS

Als u wilt inschakelen via Azure PowerShell, moet uw gebruiker die de opdracht uitvoert, inzender of SQL Security Manager Azure RBAC-rollen voor uw met SQL beheerde exemplaar hebben.

Hiervoor kan ook een aangepaste rol worden gemaakt. Hiervoor is de actie lezen en Schrijven vereist voor de actie Microsoft.Sql/managedInstances/serverConfigurationOptions.

Methoden voor het inschakelen van CETAS

Als u de PowerShell-opdrachten op een computer wilt aanroepen, moet Az-pakketversie 9.7.0 of hoger lokaal zijn geïnstalleerd. Of overweeg het gebruik van de Azure Cloud Shell- om Azure PowerShell uit te voeren op shell.azure.com.

Meld u eerst aan bij Azure en stel de juiste context in voor uw abonnement:

Login-AzAccount
$SubscriptionID = "<YourSubscriptionIDHERE>"
Select-AzSubscription -SubscriptionName $SubscriptionID

Als u de serverconfiguratieoptie allowPolybaseExportwilt beheren, past u de volgende PowerShell-scripts aan op uw abonnement en de naam van het beheerde SQL-exemplaar en voert u de opdrachten uit. Zie Set-AzSqlServerConfigurationOption en Get-AzSqlServerConfigurationOptionvoor meer informatie.

# Enable ServerConfigurationOption with name "allowPolybaseExport"
Set-AzSqlServerConfigurationOption -ResourceGroupName "resource_group_name" -InstanceName "ManagedInstanceName" `
-Name "allowPolybaseExport" -Value 1

De serverconfiguratieoptie AllowPolybaseExport uitschakelen:

# Disable ServerConfigurationOption with name "allowPolybaseExport"
Set-AzSqlServerConfigurationOption -ResourceGroupName "resource_group_name" -InstanceName "ManagedInstanceName" `
-Name "allowPolybaseExport" -Value 0

De huidige waarde van de serverconfiguratieoptie allowPolybaseExport ophalen:

# Get ServerConfigurationOptions with name "allowPolybaseExport"
Get-AzSqlServerConfigurationOption -ResourceGroupName "resource_group_name" -InstanceName "ManagedInstanceName" `
-Name "allowPolybaseExport"

Status van CETAS controleren

U kunt op elk gewenst moment de huidige status van de CETAS-configuratieoptie controleren.

Maak verbinding met uw met SQL beheerde exemplaar. Voer de volgende T-SQL uit en bekijk de kolom value van het antwoord. Zodra de serverconfiguratiewijziging is voltooid, moeten de resultaten van deze query overeenkomen met de gewenste instelling.

SELECT [name], [value] FROM sys.configurations WHERE name ='allow polybase export';

Oplossen

Zie Problemen metoplossen voor meer stappen voor het oplossen van problemen met gegevensvirtualisatie in Azure SQL Managed Instance. Foutafhandeling en veelvoorkomende foutberichten voor CETAS in Azure SQL Managed Instance volgt.

Foutafhandeling

Wanneer CREATE EXTERNAL TABLE AS SELECT gegevens exporteert naar een bestand met tekstscheidingstekens, is er geen afwijzingsbestand voor rijen die niet kunnen worden geëxporteerd.

Wanneer u de externe tabel maakt, probeert de database verbinding te maken met de externe locatie. Als de verbinding mislukt, mislukt de opdracht en wordt de externe tabel niet gemaakt. Het kan een minuut of langer duren voordat de opdracht mislukt omdat de database de verbinding minstens drie keer opnieuw probeert uit te voeren.

Veelvoorkomende foutberichten

Deze veelvoorkomende foutberichten hebben snelle uitleg over CETAS voor Azure SQL Managed Instance.

  1. Een locatie opgeven die al bestaat in de opslag.

    Oplossing: De opslaglocatie wissen (inclusief momentopname) of de locatieparameter in de query wijzigen.

    Voorbeeldfoutbericht: Msg 15842: Cannot create external table. External table location already exists.

  2. Kolomwaarden die zijn opgemaakt met behulp van JSON-objecten.

    Oplossing: Waardekolom converteren naar één VARCHAR- of NVARCHAR-kolom, of een set kolommen met expliciet gedefinieerde typen.

    Voorbeeldfoutbericht: Msg 16549: Values in column value are formatted as JSON objects and cannot be written using CREATE EXTERNAL TABLE AS SELECT.

  3. Locatieparameter is ongeldig (bijvoorbeeld meerdere //).

    Oplossing: Locatieparameter herstellen.

    Voorbeeldfoutbericht: Msg 46504: External option 'LOCATION' is not valid. Ensure that the length and range are appropriate.

  4. Er ontbreekt een van de vereiste opties (DATA_SOURCE, FILE_FORMAT, LOCATION).

    Oplossing: Voeg de ontbrekende parameter toe aan de CETAS-query.

    Voorbeeldfoutbericht: Msg 46505: Missing required external DDL option 'FILE_FORMAT'

  5. Toegangsproblemen (ongeldige referenties, verlopen referenties of referenties met onvoldoende machtigingen). Alternatieve mogelijkheid is een ongeldig pad, waarbij het beheerde SQL-exemplaar een fout 404 van de opslag heeft ontvangen.

    Oplossing: controleer de geldigheid en machtigingen van referenties. U kunt ook controleren of het pad geldig is en dat er opslagruimte bestaat. Gebruik het URL-pad adls://<container>@<storage_account>.blob.core.windows.net/<path>/.

    Voorbeeldfoutbericht: Msg 15883: Access check for '<Read/Write>' operation against '<Storage>' failed with HRESULT = '0x...'

  6. Locatiedeel van DATA_SOURCE bevat jokertekens.

    Oplossing: Jokertekens van de locatie verwijderen.

    Voorbeeldfoutbericht: Msg 16576: Location provided by DATA_SOURCE '<data source name>' cannot contain any wildcards.

  7. Het aantal jokertekens in de PARAMETER LOCATION en het aantal gepartitioneerde kolommen komen niet overeen.

    Oplossing: Zorg voor hetzelfde aantal jokertekens in LOCATION als partitiekolommen.

    Voorbeeldfoutbericht: Msg 16577: Number of wildcards in LOCATION must match the number of columns in PARTITION clause.

  8. Kolomnaam in PARTITION-component komt niet overeen met kolommen in de lijst.

    Oplossing: Zorg ervoor dat kolommen in PARTITION geldig zijn.

    Voorbeeldfoutbericht: Msg 16578: The column name '<column name>' specified in the PARTITION option does not match any column specified in the column list

  9. Kolom die meer dan één keer is opgegeven in de partitielijst.

    Oplossing: Zorg ervoor dat kolommen in de PARTITION-component uniek zijn.

    Voorbeeldfoutbericht: Msg 16579: A column has been specified more than once in the PARTITION list. Column '<column name>' is specified more than once.

  10. De kolom is meer dan één keer opgegeven in de partitielijst of komt niet overeen met kolommen uit de SELECT-lijst.

    Oplossing: Zorg ervoor dat er geen duplicaten aanwezig zijn in de partitielijst en dat de partitiekolommen aanwezig zijn in select.

    Voorbeeld van foutberichten: Msg 11569: Column <column name> has been specified more than once in the partition columns list. Please try again with a valid parameter. of Msg 11570: Column <column name> specified in the partition columns list does not match any columns in SELECT clause. Please try again with a valid parameter.

  11. Alle kolommen in de lijst PARTITION gebruiken.

    Oplossing: ten minste één van de kolommen uit het select-onderdeel mag zich niet in het PARTITIE-deel van de query bevinden.

    Voorbeeldfoutbericht: Msg 11571: All output columns in DATA_EXPORT query are declared as PARTITION columns. DATA_EXPORT query requires at least one column to export.

  12. De functie is uitgeschakeld.

    Oplossing: Schakel de functie in met behulp van de Uitgeschakeld standaard sectie in dit artikel.

    Voorbeeldfoutbericht: Msg 46552: Writing into an external table is disabled. See 'https://go.microsoft.com/fwlink/?linkid=2201073' for more information

Vergrendeling

Neemt een gedeelde vergrendeling op het OBJECT SCHEMARESOLUTION.

Voorbeelden

Een. CETAS gebruiken met een weergave om een externe tabel te maken met behulp van de beheerde identiteit

Dit voorbeeld bevat code voor het schrijven van CETAS met een weergave als bron, met behulp van door het systeem beheerde identiteit een verificatie.

CREATE DATABASE [<mydatabase>];
GO

USE [<mydatabase>];
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';

CREATE DATABASE SCOPED CREDENTIAL [WorkspaceIdentity] WITH IDENTITY = 'managed identity';
GO

CREATE EXTERNAL FILE FORMAT [ParquetFF] WITH (
    FORMAT_TYPE = PARQUET,
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
GO

CREATE EXTERNAL DATA SOURCE [SQLwriteable] WITH (
    LOCATION = 'adls://container@mystorageaccount.blob.core.windows.net/mybaseoutputfolderpath',
    CREDENTIAL = [WorkspaceIdentity]
);
GO

CREATE EXTERNAL TABLE [dbo].[<myexternaltable>] WITH (
        LOCATION = '<myoutputsubfolder>/',
        DATA_SOURCE = [SQLwriteable],
        FILE_FORMAT = [ParquetFF]
) AS
SELECT * FROM [<myview>];
GO

B. CETAS gebruiken met een weergave om een externe tabel te maken met SAS-verificatie

Dit voorbeeld bevat code voor het schrijven van CETAS met een weergave als bron, met behulp van een SAS-token als verificatie.

CREATE DATABASE [<mydatabase>];
GO

USE [<mydatabase>];
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';

CREATE DATABASE SCOPED CREDENTIAL SAS_token
WITH
  IDENTITY = 'SHARED ACCESS SIGNATURE',
  -- Remove ? from the beginning of the SAS token
  SECRET = '<azure_shared_access_signature>' ;
GO

CREATE EXTERNAL FILE FORMAT [ParquetFF] WITH (
    FORMAT_TYPE = PARQUET,
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
GO

CREATE EXTERNAL DATA SOURCE [SQLwriteable] WITH (
    LOCATION = 'adls://container@mystorageaccount.blob.core.windows.net/mybaseoutputfolderpath',
    CREDENTIAL = [SAS_token]
);
GO

CREATE EXTERNAL TABLE [dbo].[<myexternaltable>] WITH (
        LOCATION = '<myoutputsubfolder>/',
        DATA_SOURCE = [SQLwriteable],
        FILE_FORMAT = [ParquetFF]
) AS
SELECT * FROM [<myview>];
GO

C. Een externe tabel maken in één Parquet-bestand in de opslag

In de volgende twee voorbeelden ziet u hoe u enkele gegevens uit een lokale tabel kunt offloaden naar een externe tabel die is opgeslagen als parquet-bestand(en) in een Azure Blob Storage-container. Ze zijn ontworpen om te werken met AdventureWorks2022 database. In dit voorbeeld ziet u hoe u een externe tabel maakt als één Parquet-bestand, waarin in het volgende voorbeeld wordt getoond hoe u een externe tabel maakt en partitioneren in meerdere mappen met Parquet-bestanden.

In het onderstaande voorbeeld wordt een beheerde identiteit gebruikt voor verificatie. Zorg er daarom voor dat de service-principal van Azure SQL Managed Instance Rol van inzender voor opslagblobgegevens heeft in uw Azure Blob Storage-container. U kunt ook het voorbeeld wijzigen en SAS-tokens (Shared Access Secret) gebruiken voor verificatie.

In het volgende voorbeeld maakt u een externe tabel in één Parquet-bestand in Azure Blob Storage, waarbij u een selectie maakt uit SalesOrderHeader tabel voor orders die ouder zijn dan 1 januari 2014:

--Example 1: Creating an external table into a single parquet file on the storage, selecting from SalesOrderHeader table for orders older than 1-Jan-2014:
USE [AdventureWorks2022]
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Strong Password';
GO

CREATE DATABASE SCOPED CREDENTIAL [CETASCredential]
    WITH IDENTITY = 'managed identity';
GO

CREATE EXTERNAL DATA SOURCE [CETASExternalDataSource]
WITH (
    LOCATION = 'abs://container@storageaccount.blob.core.windows.net',
    CREDENTIAL = [CETASCredential] );
GO

CREATE EXTERNAL FILE FORMAT [CETASFileFormat]
WITH(
    FORMAT_TYPE=PARQUET,
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
    );
GO

-- Count how many rows we plan to offload
SELECT COUNT(*) FROM [AdventureWorks2022].[Sales].[SalesOrderHeader] WHERE
        OrderDate < '2013-12-31';

-- CETAS write to a single file, archive all data older than 1-Jan-2014:
CREATE EXTERNAL TABLE SalesOrdersExternal
WITH (
    LOCATION = 'SalesOrders/',
    DATA_SOURCE = [CETASExternalDataSource],
    FILE_FORMAT = [CETASFileFormat])
AS 
    SELECT 
        *
    FROM 
        [AdventureWorks2022].[Sales].[SalesOrderHeader]
    WHERE
        OrderDate < '2013-12-31';

-- you can query the newly created external table
SELECT COUNT (*) FROM SalesOrdersExternal;

D. Een gepartitioneerde externe tabel maken in meerdere Parquet-bestanden die zijn opgeslagen in een mapstructuur

Dit voorbeeld is gebaseerd op het vorige voorbeeld om te laten zien hoe u een externe tabel maakt en partitionert in meerdere mappen met Parquet-bestanden. U kunt gepartitioneerde tabellen gebruiken om prestatievoordelen te krijgen als uw gegevensset groot is.

Maak een externe tabel op basis van SalesOrderHeader gegevens, met behulp van de stappen uit voorbeeld B, maar partitioneer de externe tabel op OrderDate jaar en maand. Bij het uitvoeren van query's op gepartitioneerde externe tabellen kunnen we profiteren van partitieverwijdering voor prestaties.

--CETAS write to a folder hierarchy (partitioned table):
CREATE EXTERNAL TABLE SalesOrdersExternalPartitioned
WITH (
    LOCATION = 'PartitionedOrders/year=*/month=*/', 
    DATA_SOURCE = CETASExternalDataSource,
    FILE_FORMAT = CETASFileFormat,
    --year and month will correspond to the two respective wildcards in folder path    
    PARTITION (
        [Year],
        [Month]
        ) 
    )
AS
    SELECT
        *,
        YEAR(OrderDate) AS [Year],
        MONTH(OrderDate) AS [Month]
    FROM [AdventureWorks2022].[Sales].[SalesOrderHeader]
    WHERE
        OrderDate < '2013-12-31';
GO

-- you can query the newly created partitioned external table
SELECT COUNT (*) FROM SalesOrdersExternalPartitioned;

Volgende stappen