Como usar a OPENROWSET usando o pool de SQL sem servidor no Azure Synapse Analytics

A função OPENROWSET(BULK...) permite que você acesse arquivos no Armazenamento do Azure. A função OPENROWSET lê o conteúdo de uma fonte de dados remota (por exemplo, o arquivo) e retorna o conteúdo como um conjunto de linhas. No recurso do pool de SQL sem servidor, o provedor de conjuntos de linhas em massa da OPENROWSET é acessado por meio de uma chamada à função OPENROWSET e da especificação da opção BULK.

A função OPENROWSET pode ser referenciada na cláusula FROM de uma consulta como se fosse um nome de tabela OPENROWSET. Ela também dá suporte a operações em massa por meio de um provedor BULK interno que permite que os dados de um arquivo sejam lidos e retornados como um conjunto de linhas.

Observação

Não há suporte para a função OPENROWSET no pool de SQL dedicado.

Fonte de dados

A função OPENROWSET no SQL do Synapse lê o conteúdo dos arquivos de uma fonte de dados. A fonte de dados é uma conta de armazenamento do Azure e pode ser explicitamente referenciada na função OPENROWSET ou dinamicamente inferida com base na URL dos arquivos que você deseja ler. A função OPENROWSET pode opcionalmente conter um parâmetro DATA_SOURCE para especificar a fonte de dados que contém arquivos.

  • OPENROWSET sem DATA_SOURCE pode ser usado para ler diretamente o conteúdo dos arquivos do local da URL especificado como opção BULK:

    SELECT *
    FROM OPENROWSET(BULK 'http://<storage account>.dfs.core.windows.net/container/folder/*.parquet',
                    FORMAT = 'PARQUET') AS [file]
    

essa é uma forma rápida e fácil de ler o conteúdo dos arquivos sem pré-configuração. Essa opção permite que você use a opção de autenticação básica para acessar o armazenamento (passagem do Microsoft Entra para logons do Microsoft Entra e token SAS para logons do SQL).

  • OPENROWSET com DATA_SOURCE pode ser usado para acessar arquivos na conta de armazenamento especificada:

    SELECT *
    FROM OPENROWSET(BULK '/folder/*.parquet',
                    DATA_SOURCE='storage', --> Root URL is in LOCATION of DATA SOURCE
                    FORMAT = 'PARQUET') AS [file]
    

    essa opção permite que você configure o local da conta de armazenamento na fonte de dados e especifique o método de autenticação que deve ser usado para acessar o armazenamento.

    Importante

    OPENROWSET sem DATA_SOURCE oferece uma forma rápida e fácil de acessar os arquivos de armazenamento, mas oferece opções de autenticação limitadas. Por exemplo, as entidades de segurança do Microsoft Entra podem acessar arquivos apenas usando sua identidade do Microsoft Entra ou arquivos disponíveis publicamente. Se você precisar de opções de autenticação mais avançadas, use a opção DATA_SOURCE e defina a credencial que deseja usar para acessar o armazenamento.

Segurança

Um usuário de banco de dados deve ter a permissão ADMINISTER BULK OPERATIONS para usar a função OPENROWSET.

O administrador de armazenamento também deve permitir que um usuário acesse os arquivos fornecendo um token SAS válido ou permitindo que a entidade de segurança do Microsoft Entra acesse os arquivos de armazenamento. Saiba mais sobre o controle de acesso de armazenamento neste artigo.

OPENROWSET usa as regras a seguir para determinar como se autenticar no armazenamento:

  • No OPENROWSET sem DATA_SOURCE, o mecanismo de autenticação depende do tipo de chamador.
    • Qualquer usuário pode usar OPENROWSET sem DATA_SOURCE para ler arquivos publicamente disponíveis no Armazenamento do Azure.
    • Os logons do Microsoft Entra podem acessar arquivos protegidos usando sua própria identidade do Microsoft Entra se o armazenamento do Azure permitir que o usuário do Microsoft Entra acesse arquivos subjacentes (por exemplo, se o chamador tiver permissão de Storage Reader no armazenamento do Azure).
    • Os logons do SQL também podem usar OPENROWSET sem DATA_SOURCE para acessar arquivos publicamente disponíveis, arquivos protegidos usando o token SAS ou a Identidade Gerenciada do workspace do Synapse. Você precisaria criar uma credencial com escopo de servidor para permitir o acesso a arquivos de armazenamento.
  • Em OPENROWSET com DATA_SOURCE, o mecanismo de autenticação é definido na credencial no escopo do banco de dados atribuída à fonte de dados referenciada. Essa opção permite acessar o armazenamento disponível publicamente ou acessar o armazenamento usando o token SAS, a identidade gerenciada do workspace ou a identidade do chamador do Microsoft Entra (se o chamador for a entidade de segurança do Microsoft Entra). Se DATA_SOURCE referenciar ao armazenamento do Azure que não é público, você precisará criar uma credencial com escopo de banco de dados e referenciá-la no DATA SOURCE para permitir o acesso aos arquivos de armazenamento.

O chamador deve ter a permissão REFERENCES na credencial para usá-la para autenticar-se no armazenamento.

Sintaxe

--OPENROWSET syntax for reading Parquet or Delta Lake files
OPENROWSET  
( { BULK 'unstructured_data_path' , [DATA_SOURCE = <data source name>, ]
    FORMAT= ['PARQUET' | 'DELTA'] }  
)  
[WITH ( {'column_name' 'column_type' }) ]
[AS] table_alias(column_alias,...n)

--OPENROWSET syntax for reading delimited text files
OPENROWSET  
( { BULK 'unstructured_data_path' , [DATA_SOURCE = <data source name>, ] 
    FORMAT = 'CSV'
    [ <bulk_options> ]
    [ , <reject_options> ] }  
)  
WITH ( {'column_name' 'column_type' [ 'column_ordinal' | 'json_path'] })  
[AS] table_alias(column_alias,...n)
 
<bulk_options> ::=  
[ , FIELDTERMINATOR = 'char' ]    
[ , ROWTERMINATOR = 'char' ] 
[ , ESCAPECHAR = 'char' ] 
[ , FIRSTROW = 'first_row' ]     
[ , FIELDQUOTE = 'quote_characters' ]
[ , DATA_COMPRESSION = 'data_compression_method' ]
[ , PARSER_VERSION = 'parser_version' ]
[ , HEADER_ROW = { TRUE | FALSE } ]
[ , DATAFILETYPE = { 'char' | 'widechar' } ]
[ , CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]
[ , ROWSET_OPTIONS = '{"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]}' ]

<reject_options> ::=  
{  
    | MAXERRORS = reject_value,  
    | ERRORFILE_DATA_SOURCE = <data source name>,
    | ERRORFILE_LOCATION = '/REJECT_Directory'
}  

Argumentos

Você tem três opções para arquivos de entrada que contêm os dados de destino para consultar. Os valores válidos são:

  • 'CSV': inclui qualquer arquivo de texto delimitado com separadores de linha/coluna. É possível usar qualquer caractere como um separador de campo, como TSV: FIELDTERMINATOR = guia.

  • 'PARQUET': arquivo binário no formato Parquet

  • 'DELTA' - um conjunto de arquivos Parquet organizados no formato Delta Lake (versão prévia)

Valores com espaços em branco não são válidos, por exemplo, “CSV” não é um valor válido.

'unstructured_data_path'

O unstructured_data_path que estabelece um caminho para os dados pode ser um caminho absoluto ou relativo:

  • O caminho absoluto no formato \<prefix>://\<storage_account_path>/\<storage_path> permite que um usuário leia os arquivos diretamente.
  • Caminho relativo no formato <storage_path> que deve ser usado com o parâmetro DATA_SOURCE e descreve o padrão de arquivo dentro do local <storage_account_path> definido em EXTERNAL DATA SOURCE.

Abaixo, você encontrará os valores de <caminho de conta de armazenamento> relevantes que serão vinculados à fonte de dados externa específica.

Fonte de dados externa Prefixo Caminho da conta de armazenamento
Armazenamento do Blobs do Azure http[s] <storage_account>.blob.core.windows.net/path/file
Armazenamento do Blobs do Azure wasb[s] <container>@<storage_account>.blob.core.windows.net/path/file
Azure Data Lake Storage Gen1 http[s] <storage_account>.azuredatalakestore.net/webhdfs/v1
Azure Data Lake Storage Gen2 http[s] <storage_account>.dfs.core.windows.net /path/file
Azure Data Lake Storage Gen2 abfs[s] <file_system>@<account_name>.dfs.core.windows.net/path/file

'<storage_path>'

Especifica um caminho no armazenamento que aponta para a pasta ou o arquivo que você deseja ler. Se o caminho apontar para um contêiner ou uma pasta, todos os arquivos serão lidos nessa pasta ou nesse contêiner específico. Os arquivos nas subpastas não serão incluídos.

Use curingas para direcionar vários arquivos ou várias pastas. O uso de vários curingas não consecutivos é permitido. Veja abaixo um exemplo que lê todos os arquivos csv que começam com population de todas as pastas que começam com /csv/population:
https://sqlondemandstorage.blob.core.windows.net/csv/population*/population*.csv

Se você especificar o unstructured_data_path para ser uma pasta, uma consulta do pool de SQL sem servidor vai recuperar os arquivos dessa pasta.

Você pode instruir o pool de SQL sem servidor a percorrer as pastas especificando /* ao final do caminho, como no exemplo: https://sqlondemandstorage.blob.core.windows.net/csv/population/**

Observação

Ao contrário do Hadoop e do PolyBase, o pool de SQL sem servidor não retorna subpastas, a menos que você especifique /** ao final do caminho. Assim como o Hadoop e o PolyBase, ele não retorna arquivos cujo nome começa com um sublinhado (_) ou um ponto-final (.).

No exemplo abaixo, se unstructured_data_path=https://mystorageaccount.dfs.core.windows.net/webdata/, uma consulta do pool de SQL sem servidor retornará linhas de mydata.txt. Ele não retornará mydata2.txt e mydata3.txt porque eles estão localizados em uma subpasta.

Recursive data for external tables

[WITH ( {'column_name' 'column_type' [ 'column_ordinal'] }) ]

A cláusula WITH permite que você especifique as colunas que deseja ler dos arquivos.

  • Em arquivos de dados CSV, para ler todas as colunas, forneça nomes de colunas e os respectivos tipos de dados. Se você quiser um subconjunto de colunas, use números ordinais para escolher as colunas dos arquivos de dados de origem por ordinal. As colunas serão vinculadas à designação ordinal. Se HEADER_ROW = TRUE for usado, então a associação de coluna será feita pelo nome da coluna em vez da posição ordinal.

    Dica

    Também é possível omitir a cláusula WITH para arquivos CSV. Os tipos de dados serão inferidos automaticamente do conteúdo do arquivo. Você pode usar o argumento HEADER_ROW para especificar a existência da linha de cabeçalho e, nesse caso, os nomes das colunas serão lidos dessa linha. Para obter detalhes, confira a descoberta automática de esquema.

  • Em arquivos Parquet ou Delta Lake, forneça nomes de colunas que correspondam aos nomes de colunas nos arquivos de dados de origem. As colunas serão vinculadas ao nome e diferenciarão maiúsculas de minúsculas. Se a cláusula WITH for omitida, todas as colunas de arquivos Parquet serão retornadas.

    Importante

    Os nomes de coluna nos arquivos Parquet e Delta Lake diferenciam maiúsculas de minúsculas. Se você especificar o nome da coluna com as configurações de maiúsculas e minúsculas diferentes do nome da coluna nos arquivos, valores NULL serão retornados para essa coluna.

column_name = nome da coluna de saída. Se fornecido, esse nome substitui o nome da coluna no arquivo de origem e o nome da coluna fornecido no caminho JSON, se houver um. Se json_path não for fornecido, ele será adicionado automaticamente como '$.column_name'. Verifique o argumento json_path para ver o comportamento.

column_type = tipo de dados da coluna de saída. A conversão de tipo de dados implícita ocorrerá aqui.

column_ordinal = número ordinal da coluna nos arquivos de origem. Esse argumento é ignorado em arquivos Parquet, pois a associação é feita por nome. O seguinte exemplo retornará uma segunda coluna somente de um arquivo CSV:

WITH (
    --[country_code] VARCHAR (5) COLLATE Latin1_General_BIN2,
    [country_name] VARCHAR (100) COLLATE Latin1_General_BIN2 2
    --[year] smallint,
    --[population] bigint
)

json_path = expressão do caminho JSON para a coluna ou propriedade aninhada. O modo de caminho padrão é incerto.

Observação

Em modo estrito, a consulta falhará com erro se o caminho fornecido não existir. No modo incerto, a consulta será bem-sucedida e a expressão de caminho JSON for avaliada como NULL.

<bulk_options>

FIELDTERMINATOR ='field_terminator'

Especifica o terminador de campo a ser usado. O terminador de campo padrão é uma vírgula (" , ").

ROWTERMINATOR ='row_terminator'`

Especifica o terminador de linha a ser usado. Se o terminador de linha não for especificado, um dos terminadores padrão será usado. Os terminadores padrão para PARSER_VERSION = '1.0' são \r\n, \n e \r. Os terminadores padrão para PARSER_VERSION = '2.0' são \r\n e \n.

Observação

Quando você usa PARSER_VERSION='1.0' e especifica \n (nova linha) como terminador de linha, ele será automaticamente prefixado com um caractere \r (retorno de carro), o que resulta em um terminador de linha \r\n.

ESCAPE_CHAR = 'char'

Especifica o caractere no arquivo que é usado para fazer escape dele mesmo e de todos os valores delimitadores no arquivo. Se o caractere de escape for seguido por um valor diferente dele mesmo ou por um dos valores delimitadores, o caractere de escape será removido durante a leitura do valor.

O parâmetro ESCAPECHAR será aplicado independentemente de FIELDQUOTE estar ou não habilitado. Ele não será usado para fazer escape do caractere de aspas. O caractere de aspas deve ter escape com outro caractere de aspas. O caractere de aspas poderá aparecer no valor da coluna somente se o valor for encapsulado com caracteres de aspas.

FIRSTROW = 'first_row'

Especifica o número da primeira linha a carregar. O padrão é 1 e indica a primeira fila no arquivo de dados especificado. Os números de linhas são determinados pela contagem dos terminadores de linha. FIRSTROW tem base 1.

FIELDQUOTE = 'field_quote'

Especifica um caractere que será usado como o caractere de aspas no arquivo CSV. Se não for especificado, o caractere de aspas (") será usado.

DATA_COMPRESSION = 'data_compression_method'

Especifica o método de compactação. Com suporte somente em PARSER_VERSION='1.0'. Há suporte para o seguinte método de compactação:

  • GZIP

PARSER_VERSION = 'parser_version'

Especifica a versão do analisador a ser usada ao ler arquivos. As versões do analisador CSV com suporte no momento são 1.0 e 2.0:

  • PARSER_VERSION = '1.0'
  • PARSER_VERSION = '2.0'

O analisador CSV versão 1.0 é o padrão e conta com muitos recursos. A versão 2.0 foi criada para ter um desempenho aprimorado e não dá suporte a todas as opções e codificações.

Especificações do analisador CSV versão 1.0:

  • As opções a seguir não têm suporte: HEADER_ROW.
  • Os terminadores padrão são \r\n, \n e \r.
  • Se você especificar \n (nova linha) como terminador de linha, ele será automaticamente prefixado com um caractere \r (retorno de carro), o que resulta em um terminador de linha \r\n.

Especificações do analisador CSV versão 2.0:

  • não há suporte para todos os tipos de dados.
  • O tamanho máximo da coluna de caracteres é 8.000.
  • O limite de tamanho máximo de linha é de 8 MB.
  • As opções a seguir não têm suporte: DATA_COMPRESSION.
  • A cadeia de caracteres vazia entre aspas ("") é interpretada como cadeia de caracteres vazia.
  • A opção DATEFORMAT SET não é respeitada.
  • Formato com suporte para o tipo de dados DATE: AAAA-MM-DD
  • Formato com suporte para o tipo de dados TIME: HH:MM:SS[.segundos fracionários]
  • Formato com suporte para o tipo de dados DATETIME2: AAAA-MM-DD HH:MM:SS[.segundos fracionários]
  • Os terminadores padrão são \r\n e \n.

HEADER_ROW = { TRUE | FALSE }

Especifica se um arquivo CSV contém a linha de cabeçalho. O padrão é FALSE. Com suporte em PARSER_VERSION='2.0'. Se for TRUE, os nomes de coluna serão lidos da primeira linha, de acordo com o argumento FIRSTROW. Se TRUE e esquema forem especificados usando WITH, a associação de nomes de colunas será feita por nome da coluna, não posições ordinais.

DATAFILETYPE = { 'char' | 'widechar' }

Especifica a codificação: char é usado para arquivos UTF8 e widechar é usado para arquivos UTF16.

CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' }

Especifica a página de código dos dados no arquivo de dados. O valor padrão é 65001 (codificação UTF-8). Confira mais detalhes sobre essa opção aqui.

ROWSET_OPTIONS = '{"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]}'

Essa opção desabilitará a verificação de modificação de arquivo durante a execução da consulta e lerá os arquivos que são atualizados enquanto a consulta está em execução. Essa é uma opção útil quando você precisa ler arquivos somente de acréscimo que são anexados enquanto a consulta está em execução. Nos arquivos acrescentáveis, o conteúdo existente não é atualizado e apenas novas linhas são adicionadas. Portanto, a probabilidade de resultados errados é minimizada em comparação com os arquivos atualizáveis. Essa opção pode permitir que você leia os arquivos acrescentados com frequência sem precisar lidar com os erros. Veja mais informações na seção Como consultar arquivos CSV acrescentáveis.

Opções de rejeição

Observação

O recurso de linhas rejeitadas está em Visualização Pública. Observe que o recurso de linhas rejeitadas funciona para arquivos de texto delimitados e PARSER_VERSION 1.0.

Especifique parâmetros de rejeição que determinam como o serviço manipulará registros sujos recuperados da fonte de dados externa. Um registro de dados é considerado “sujo” se os tipos de dados reais não correspondem às definições de coluna da tabela externa.

Quando você não especifica nem altera os valores de rejeição, o serviço usa valores padrão. O serviço usará as opções de rejeição para determinar o número de linhas que podem ser rejeitadas antes que a consulta real falhe. A consulta retorna resultados (parciais) até que o limite de rejeição seja excedido. Em seguida, ela falha com a mensagem de erro apropriada.

MAXERRORS = reject_value

Especifica o número ou o percentual de linhas que podem ser rejeitadas antes da consulta falhar. MAXERRORS deve ser um inteiro entre 0 e 2.147.483.647.

ERRORFILE_DATA_SOURCE = data source

Especifica a fonte de dados em que as linhas rejeitadas e o arquivo de erro correspondente devem ser gravados.

ERRORFILE_LOCATION = Directory Location

Especifica o diretório no DATA_SOURCE, ou ERROR_FILE_DATASOURCE, se especificado, em que as linhas rejeitadas e o arquivo de erro correspondente devem ser gravados. Se o caminho especificado não existir, o serviço criará um em seu nome. Um diretório filho é criado com o nome "rejectedrows". O caractere " " garante que o diretório tenha escape para outro processamento de dados, a menos que explicitamente nomeado no parâmetro de localização. Dentro desse diretório, há uma pasta criada com base na hora do envio do carregamento no formato YearMonthDay_HourMinuteSecond_StatementID (por exemplo, 20180330-173205-559EE7D2-196D-400A-806D-3BF5D007F891). Você pode usar a ID da instrução para correlacionar a pasta com a consulta que a gerou. Nesta pasta, dois arquivos são gravados: o arquivo error.json e o arquivo de dados.

O arquivo error.json contém a matriz json com os erros encontrados relacionados a linhas rejeitadas. Cada elemento que representa o erro contém os seguintes atributos:

Atributo Descrição
Erro Motivo pelo qual a linha é rejeitada.
Linha Número ordinal de linha rejeitado no arquivo.
Coluna Número ordinal de coluna rejeitada.
Valor Valor de coluna rejeitado. Se o valor for maior que 100 caracteres, somente os primeiros 100 caracteres serão exibidos.
Arquivo Caminho para o arquivo ao qual a linha pertence.

Análise rápida de texto delimitado

Há duas versões do analisador de texto delimitado que você pode usar. O analisador CSV versão 1.0 é padrão e repleto de recursos, enquanto o analisador versão 2.0 foi criado para desempenho. A melhoria de desempenho do analisador 2.0 vem de técnicas de análise avançadas e do multithreading. A diferença de velocidade será maior conforme aumentar o tamanho do arquivo.

Descoberta automática de esquema

Você pode consultar com facilidade arquivos CSV e Parquet sem conhecer ou especificar o esquema omitindo a cláusula WITH. Os nomes de coluna e os tipos de dados serão inferidos dos arquivos.

Os arquivos Parquet contêm metadados de coluna que serão lidos, mapeamentos de tipo podem ser encontrados nos mapeamentos de tipo do Parquet. Confira como ler os arquivos Parquet sem especificar o esquema para obter exemplos.

Para arquivos CSV, os nomes das colunas podem ser lidos na linha de cabeçalho. Você pode especificar se a linha de cabeçalho existe usando o argumento HEADER_ROW. Se HEADER_ROW=FALSE, serão usados nomes de coluna genéricos: C1, C2, ... Cn, em que n corresponde ao número total de colunas contidas no arquivo. Os tipos de dados serão inferidos das primeiras 100 linhas de dados. Confira como ler os arquivos CSV sem especificar o esquema para obter exemplos.

Se você ler o número de arquivos de uma vez, o esquema será inferido com base no primeiro serviço de arquivo obtido no armazenamento. Isso pode significar que algumas das colunas esperadas serão omitidas porque o arquivo usado pelo serviço para definir o esquema não as continha. Nesse caso, use a cláusula OPENROWSET WITH.

Importante

Há casos em que o tipo de dados apropriado não pode ser inferido devido à falta de informações e um tipo de dados mais abrangente é usado. Isso causa uma sobrecarga de desempenho e é particularmente significativo para colunas de caracteres que serão inferidas como varchar (8000). Para obter um desempenho ideal, confira os tipos de dados inferidos e use os tipos de dados apropriados.

Mapeamento de tipos para Parquet

Os arquivos Parquet e Delta Lake contêm descrições de tipo para cada coluna. A tabela a seguir descreve como os tipos Parquet são mapeados para tipos nativos do SQL.

Tipo do Parquet Tipo lógico do Parquet (anotação) Tipo de dados SQL
BOOLEAN bit
BINARY/BYTE_ARRAY varbinary
DOUBLE FLOAT
FLOAT real
INT32 int
INT64 BIGINT
INT96 datetime2
FIXED_LEN_BYTE_ARRAY binary
BINARY UTF8 varchar *(ordenação UTF8)
BINARY STRING varchar *(ordenação UTF8)
BINARY ENUM varchar *(ordenação UTF8)
FIXED_LEN_BYTE_ARRAY UUID UNIQUEIDENTIFIER
BINARY DECIMAL decimal
BINARY JSON varchar(8000) *(agrupamento UTF8)
BINARY BSON Sem suporte
FIXED_LEN_BYTE_ARRAY DECIMAL decimal
BYTE_ARRAY INTERVAL Sem suporte
INT32 INT(8, true) SMALLINT
INT32 INT(16, true) SMALLINT
INT32 INT(32, true) INT
INT32 INT(8, false) TINYINT
INT32 INT(16, false) INT
INT32 INT(32, false) BIGINT
INT32 DATE date
INT32 DECIMAL decimal
INT32 TIME (MILLIS) time
INT64 INT(64, true) BIGINT
INT64 INT(64, false) decimal(20,0)
INT64 DECIMAL decimal
INT64 TIME (MICROS) time
INT64 TIME (NANOS) Sem suporte
INT64 TIMESTAMP (normalizado para UTC) (MILLIS/MICROS) datetime2
INT64 TIMESTAMP (não normalizado para UTC) (MILLIS/MICROS) bigint – Lembre-se de ajustar explicitamente o valor bigint com a diferença de fuso horário antes de convertê-lo em um valor de datetime.
INT64 TIMESTAMP (NANOS) Sem suporte
Tipo complexo LISTA varchar(8000), serializado em JSON
Tipo complexo MAP varchar(8000), serializado em JSON

Exemplos

Ler arquivos CSV sem especificar o esquema

O seguinte exemplo lê o arquivo CSV que contém a linha de cabeçalho sem especificar os nomes das colunas ou os tipos de dados:

SELECT 
    *
FROM OPENROWSET(
    BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.csv',
    FORMAT = 'CSV',
    PARSER_VERSION = '2.0',
    HEADER_ROW = TRUE) as [r]

O seguinte exemplo lê o arquivo CSV que não contém a linha de cabeçalho sem especificar os nomes das colunas ou os tipos de dados:

SELECT 
    *
FROM OPENROWSET(
    BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.csv',
    FORMAT = 'CSV',
    PARSER_VERSION = '2.0') as [r]

Ler arquivos Parquet sem especificar o esquema

O seguinte exemplo retorna todas as colunas da primeira linha do conjunto de dados de censo no formato Parquet, sem especificar nomes de colunas nem tipos de dados:

SELECT 
    TOP 1 *
FROM  
    OPENROWSET(
        BULK 'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=20*/*.parquet',
        FORMAT='PARQUET'
    ) AS [r]

Ler arquivos Delta Lake sem especificar o esquema

O seguinte exemplo retorna todas as colunas da primeira linha do conjunto de dados de censo no formato Delta Lake, sem especificar nomes de colunas nem tipos de dados:

SELECT 
    TOP 1 *
FROM  
    OPENROWSET(
        BULK 'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=20*/*.parquet',
        FORMAT='DELTA'
    ) AS [r]

Ler colunas específicas do arquivo CSV

O exemplo a seguir retorna apenas duas colunas com números ordinais 1 e 4 dos arquivos population*.csv. Como não há nenhuma linha de cabeçalho nos arquivos, ele inicia a leitura na primeira linha:

SELECT 
    * 
FROM OPENROWSET(
        BULK 'https://sqlondemandstorage.blob.core.windows.net/csv/population/population*.csv',
        FORMAT = 'CSV',
        FIRSTROW = 1
    )
WITH (
    [country_code] VARCHAR (5) COLLATE Latin1_General_BIN2 1,
    [population] bigint 4
) AS [r]

Ler colunas específicas do arquivo Parquet

O exemplo seguinte retorna apenas duas colunas da primeira linha do conjunto de dados do censo em formato Parquet:

SELECT 
    TOP 1 *
FROM  
    OPENROWSET(
        BULK 'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=20*/*.parquet',
        FORMAT='PARQUET'
    )
WITH (
    [stateName] VARCHAR (50),
    [population] bigint
) AS [r]

Especificar colunas usando caminhos JSON

O seguinte exemplo mostra como você pode usar expressões de caminho JSON na cláusula WITH e demonstra a diferença entre os modos de caminho estrito e incerto:

SELECT 
    TOP 1 *
FROM  
    OPENROWSET(
        BULK 'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=20*/*.parquet',
        FORMAT='PARQUET'
    )
WITH (
    --lax path mode samples
    [stateName] VARCHAR (50), -- this one works as column name casing is valid - it targets the same column as the next one
    [stateName_explicit_path] VARCHAR (50) '$.stateName', -- this one works as column name casing is valid
    [COUNTYNAME] VARCHAR (50), -- STATEname column will contain NULLs only because of wrong casing - it targets the same column as the next one
    [countyName_explicit_path] VARCHAR (50) '$.COUNTYNAME', -- STATEname column will contain NULLS only because of wrong casing and default path mode being lax

    --strict path mode samples
    [population] bigint 'strict $.population' -- this one works as column name casing is valid
    --,[population2] bigint 'strict $.POPULATION' -- this one fails because of wrong casing and strict path mode
)
AS [r]

Especificar vários arquivos/pastas no caminho BULK

O exemplo a seguir mostra como você pode usar vários caminhos de arquivo/pasta no parâmetro BULK:

SELECT 
    TOP 10 *
FROM  
    OPENROWSET(
        BULK (
            'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=2000/*.parquet',
            'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=2010/*.parquet'
        ),
        FORMAT='PARQUET'
    )
AS [r]

Próximas etapas

Para obter mais amostras, confira o Início Rápido: Consultar o armazenamento de dados para saber como usar OPENROWSET para ler formatos de arquivo CSV, PARQUET, DELTA LAKE e JSON. Confira as melhores práticas para alcançar o desempenho ideal. Você também pode aprender a salvar os resultados de sua consulta no Armazenamento do Azure usando CETAS.