OPENROWSET (Transact-SQL)
Si applica a:SQL Server
Database SQL di Azure
Istanza gestita di SQL di Azure
Include tutte le informazioni di connessione necessarie per l'accesso remoto ai dati da un'origine dati OLE DB. Si tratta di un metodo alternativo per l'accesso alle tabelle di un server collegato e corrisponde a un metodo ad hoc eseguito una sola volta per la connessione e l'accesso ai dati remoti tramite OLE DB. Per ottenere riferimenti più frequenti alle origini dati OLE DB, utilizzare server collegati. Per altre informazioni, vedere Server collegati (Motore di database). È OPENROWSET
possibile fare riferimento alla FROM
funzione nella clausola di una query come se fosse un nome di tabella. È anche possibile fare riferimento alla funzione OPENROWSET
come tabella di destinazione di un'istruzioneINSERT
, UPDATE
o DELETE
, a seconda delle funzionalità del provider OLE DB. Anche quando la query può restituire più set di risultati, la funzione OPENROWSET
restituisce solo il primo set.
OPENROWSET
supporta anche le operazioni bulk tramite un provider BULK
predefinito che consente di leggere i dati da un file e restituirli come set di righe.
Molti esempi in questo articolo si applicano solo a SQL Server. Dettagli e collegamenti a esempi simili su altre piattaforme:
- Per la sintassi di Microsoft Fabric Warehouse, selezionare Infrastruttura nell'elenco a discesa della versione.
- Per esempi su Istanza gestita di SQL di Azure, vedere Eseguire query sulle origini dati con OPENROWSET.
- Database SQL di Azure supporta solo la lettura da Archiviazione BLOB di Azure.
- Per informazioni ed esempi con pool SQL serverless in Azure Synapse, vedere Come usare OPENROWSET usando il pool SQL serverless in Azure Synapse Analytics.
- I pool SQL dedicati in Azure Synapse non supportano la
OPENROWSET
funzione.
Convenzioni relative alla sintassi Transact-SQL
Sintassi
OPENROWSET
la sintassi viene usata per eseguire query su origini dati esterne:
OPENROWSET
( 'provider_name'
, { 'datasource' ; 'user_id' ; 'password' | 'provider_string' }
, { [ catalog. ] [ schema. ] object | 'query' }
)
OPENROWSET(BULK)
la sintassi viene usata per leggere i file esterni:
OPENROWSET( BULK 'data_file' ,
{ FORMATFILE = 'format_file_path' [ <bulk_options> ]
| SINGLE_BLOB | SINGLE_CLOB | SINGLE_NCLOB }
)
<bulk_options> ::=
[ , DATASOURCE = 'data_source_name' ]
-- bulk_options related to input file format
[ , CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]
[ , FORMAT = { 'CSV' | 'PARQUET' | 'DELTA' } ]
[ , FIELDQUOTE = 'quote_characters' ]
[ , FORMATFILE = 'format_file_path' ]
[ , FORMATFILE_DATA_SOURCE = 'data_source_name' ]
[ , FIRSTROW = first_row ]
[ , LASTROW = last_row ]
[ , MAXERRORS = maximum_errors ]
[ , ERRORFILE = 'file_name' ]
[ , ERRORFILE_DATA_SOURCE = 'data_source_name' ]
[ , ROWS_PER_BATCH = rows_per_batch ]
[ , ORDER ( { column [ ASC | DESC ] } [ , ...n ] ) [ UNIQUE ] ]
Argomenti
Argomenti comuni
'provider_name'
Stringa di caratteri che rappresenta il nome descrittivo (o PROGID
) del provider OLE DB come specificato nel Registro di sistema.
provider_name non ha un valore predefinito. Sono esempi di nomi di provider Microsoft.Jet.OLEDB.4.0
, SQLNCLI
o MSDASQL
.
'datasource'
Costante stringa che corrisponde a una determinata origine dati OLE DB.
datasource è la DBPROP_INIT_DATASOURCE
proprietà da passare all'interfaccia IDBProperties
del provider per inizializzare il provider. In genere, questa stringa include il nome del file di database, il nome di un server di database o un nome che il provider riconosce per individuare il database o i database.
L'origine dati può essere il percorso di file C:\SAMPLES\Northwind.mdb'
per il provider Microsoft.Jet.OLEDB.4.0
o la stringa di connessione Server=Seattle1;Trusted_Connection=yes;
per il provider SQLNCLI
.
'user_id'
Costante stringa che corrisponde al nome utente passato al provider OLE DB specificato.
user_id specifica il contesto di sicurezza per la connessione e viene passato come DBPROP_AUTH_USERID
proprietà per inizializzare il provider.
user_id non può essere un nome di accesso di Microsoft Windows.
'password'
Costante stringa che rappresenta la password utente da passare al provider OLE DB.
la password viene passata come DBPROP_AUTH_PASSWORD
proprietà durante l'inizializzazione del provider.
password non può essere una password di Microsoft Windows.
SELECT a.* FROM OPENROWSET(
'Microsoft.Jet.OLEDB.4.0',
'C:\SAMPLES\Northwind.mdb';
'admin';
'password',
Customers
) AS a;
'provider_string'
Un stringa di connessione specifico del provider passato come DBPROP_INIT_PROVIDERSTRING
proprietà per inizializzare il provider OLE DB. In provider_string sono incluse in genere tutte le informazioni di connessione necessarie per inizializzare il provider. Per un elenco di parole chiave riconosciute dal provider OLE DB di SQL Server Native Client, vedere Initialization and Authorization Properties (Native Client OLE DB Provider).For a list of keywords that the SQL Server Native Client OLE DB provider recognizes, see Initialization and Authorization Properties (Native Client OLE DB Provider).
SELECT d.* FROM OPENROWSET(
'SQLNCLI',
'Server=Seattle1;Trusted_Connection=yes;',
Department
) AS d;
<table_or_view>
Tabella o vista remota che contiene i dati che devono essere letti da OPENROWSET
. Può essere un oggetto con nome in tre parti con i componenti seguenti:
- catalogo (facoltativo) - Nome del catalogo o del database contenente l'oggetto specificato.
- schema (facoltativo) - Nome dello schema o del proprietario dell'oggetto specificato.
- oggetto - Nome dell'oggetto che identifica in modo univoco l'oggetto da usare.
SELECT d.* FROM OPENROWSET(
'SQLNCLI',
'Server=Seattle1;Trusted_Connection=yes;',
AdventureWorks2022.HumanResources.Department
) AS d;
'query'
Costante stringa inviata ed eseguita dal provider. L'istanza locale di SQL Server non elabora questa query, ma elabora i risultati delle query restituiti dal provider, una query pass-through. Le query pass-through sono utili quando vengono usate nei provider che non rendono disponibili i dati tabulari tramite nomi di tabella, ma solo tramite una lingua di comando. Le query pass-through sono supportate nel server remoto, a condizione che il provider di query supporti l'oggetto OLE DB Command e le relative interfacce obbligatorie. Per altre informazioni, vedere Interfacce OLE DB (SQL Server Native Client).
SELECT a.*
FROM OPENROWSET(
'SQLNCLI',
'Server=Seattle1;Trusted_Connection=yes;',
'SELECT TOP 10 GroupName, Name FROM AdventureWorks2022.HumanResources.Department'
) AS a;
Argomenti BULK
Usa il BULK
provider del set di righe per OPENROWSET
per leggere i dati da un file. In SQL Server è OPENROWSET
possibile leggere da un file di dati senza caricare i dati in una tabella di destinazione. In questo modo è possibile usare OPENROWSET
con un'istruzione di base SELECT
.
Importante
Database SQL di Azure supporta solo la lettura da Archiviazione BLOB di Azure.
Gli argomenti dell'opzione BULK
consentono un controllo significativo sulla posizione in cui iniziare e terminare i dati di lettura, su come gestire gli errori e sul modo in cui i dati vengono interpretati. Ad esempio, è possibile specificare che il file di dati viene letto come set di righe a riga singola, a colonna singola di tipo varbinary, varchar o nvarchar. Il comportamento predefinito viene illustrato nelle descrizioni degli argomenti seguenti.
Per informazioni su come usare l'opzione BULK
, vedere la sezione Osservazioni più avanti in questo articolo. Per informazioni sulle autorizzazioni richieste dall'opzione BULK
, vedere la sezione Autorizzazioni più avanti in questo articolo.
Nota
Se usato per importare dati con il modello di recupero con registrazione completa, OPENROWSET (BULK ...)
non ottimizza la registrazione.
Per informazioni sulla preparazione dei dati per l'importazione bulk, vedere Preparare i dati per l'esportazione o l'importazione bulk.
BULK 'data_file'
Percorso completo del file di dati i cui dati devono essere copiati nella tabella di destinazione.
SELECT * FROM OPENROWSET(
BULK 'C:\DATA\inv-2017-01-19.csv',
SINGLE_CLOB
) AS DATA;
A partire da SQL Server 2017 (14.x), il file specificato in data_file può essere presente in Archiviazione BLOB di Azure. Per esempi, vedere Esempi di accesso in blocco ai dati in Archiviazione BLOB di Azure.
Importante
Database SQL di Azure supporta solo la lettura da Archiviazione BLOB di Azure.
Opzioni di gestione degli errori BULK
ERRORFILE = 'file_name'
Specifica il file usato per raccogliere le righe che contengono errori di formattazione e non possono essere convertite in un set di righe OLE DB. Tali righe vengono copiate nel file degli errori dal file di dati così come sono.
Il file di errori viene creato all'inizio dell'esecuzione del comando. Se il file esiste già, viene generato un errore. Viene inoltre creato un file di controllo con estensione ERROR.txt. Questo file contiene un riferimento a ogni riga nel file degli errori e fornisce informazioni di diagnostica. Dopo aver corretto gli errori, è possibile caricare i dati.
A partire da SQL Server 2017 (14.x), può error_file_path
essere in Archiviazione BLOB di Azure.
ERRORFILE_DATA_SOURCE_NAME
A partire da SQL Server 2017 (14.x), questo argomento è un'origine dati esterna denominata che punta al percorso di archiviazione BLOB di Azure del file di errore che conterrà errori rilevati durante l'importazione. L'origine dati esterna deve essere creata utilizzando .TYPE = BLOB_STORAGE
Per altre informazioni, vedere CREATE EXTERNAL DATA SOURCE.
MAXERRORS = maximum_errors
Specifica il numero massimo di errori di sintassi o righe non conformi, come definito nel file di formato, che può verificarsi prima OPENROWSET
di generare un'eccezione. Finché MAXERRORS
non viene raggiunto, OPENROWSET
ignora ogni riga non valida, non la carica e conta la riga non valida come un errore.
Il valore predefinito per maximum_errors è 10.
Nota
MAX_ERRORS
non si applica ai CHECK
vincoli o alla conversione di tipi di dati money e Bigint .
Opzioni di elaborazione dati BULK
FIRSTROW = first_row
Specifica il numero della prima riga da caricare. Il valore predefinito è 1. Questo valore indica la prima riga nel file di dati specificato. I numeri di riga sono determinati dal conteggio dei caratteri di terminazione.
FIRSTROW
è basato su 1.
LASTROW = last_row
Specifica il numero dell'ultima riga da caricare. Il valore predefinito è 0. Questo valore indica l'ultima riga nel file di dati specificato.
ROWS_PER_BATCH = rows_per_batch
Specifica il numero approssimativo di righe di dati nel file di dati. Questo valore deve essere dello stesso ordine del numero effettivo di righe.
OPENROWSET
importa sempre un file di dati come batch singolo. Se tuttavia si specifica rows_per_batch con un valore > 0, Query Processor usa il valore di rows_per_batch come hint per l'allocazione delle risorse nel piano di query.
Per impostazione predefinita, ROWS_PER_BATCH
è sconosciuto. Specificare ROWS_PER_BATCH = 0
equivale a omettere ROWS_PER_BATCH
.
ORDER ( { column [ ASC | DESC ] } [ ,... n ] [ UNIQUE ] )
Hint facoltativo che specifica il modo in cui vengono ordinati i dati nel file di dati. Per impostazione predefinita, per l'operazione bulk si presume che il file di dati non sia ordinato. Le prestazioni possono migliorare se Query Optimizer può sfruttare l'ordine per generare un piano di query più efficiente. L'elenco seguente fornisce esempi per quando si specifica un ordinamento può essere utile:
- Inserimento di righe in una tabella con un indice cluster, in cui i dati del set di righe sono ordinati in base alla chiave dell'indice cluster.
- Unione del set di righe con un'altra tabella, in cui le colonne di ordinamento e di join corrispondono.
- Aggregazione dei dati del set di righe tramite le colonne dell'ordinamento.
- Utilizzo del set di righe come tabella di origine nella
FROM
clausola di una query, in cui le colonne di ordinamento e join corrispondono.
UNIQUE
Specifica che il file di dati non contiene voci duplicate.
Se le righe effettive nel file di dati non vengono ordinate in base all'ordine specificato o se l'hint UNIQUE
è specificato e le chiavi duplicate sono presenti, viene restituito un errore.
Quando si utilizzano gli alias di colonna, sono necessari ORDER
alias di colonna. L'elenco di alias di colonna deve fare riferimento alla tabella derivata a cui si accede dalla BULK
clausola . I nomi di colonna specificati nella ORDER
clausola fanno riferimento a questo elenco di alias di colonna. Non è possibile specificare tipi valore di grandi dimensioni (varchar(max), nvarchar(max), varbinary(max)e xml) e tipi loB (large object) (text, ntext e image).
SINGLE_BLOB
Restituisce il contenuto di data_file come set di righe a riga singola e a colonna singola di tipo varbinary(max).
Importante
È consigliabile importare dati XML solo usando l'opzione SINGLE_BLOB
, anziché SINGLE_CLOB
e SINGLE_NCLOB
, perché supporta solo SINGLE_BLOB
tutte le conversioni di codifica di Windows.
SINGLE_CLOB
Leggendo data_file come ASCII, restituisce il contenuto come set di righe a riga singola e colonna singola di tipo varchar(max), usando le regole di confronto del database corrente.
SINGLE_NCLOB
Leggendo data_file come Unicode, restituisce il contenuto come set di righe a riga singola e a colonna singola di tipo nvarchar(max), usando le regole di confronto del database corrente.
SELECT * FROM OPENROWSET(
BULK N'C:\Text1.txt',
SINGLE_NCLOB
) AS Document;
Opzioni di formato del file di input BULK
CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' }
Specifica la tabella codici dei dati contenuti nel file di dati.
CODEPAGE
è rilevante solo se i dati contengono colonne char, varchar o text con valori di carattere superiori a 127 o minori di 32.
Importante
CODEPAGE
non è un'opzione supportata in Linux.
Nota
È consigliabile specificare un nome di regole di confronto per ogni colonna in un file di formato tranne quando si vuole assegnare all'opzione 65001 la priorità sulla specifica delle regole di confronto o della tabella codici.
Valore CODEPAGE | Descrizione |
---|---|
ACP |
Le colonne con tipo di dati char, varchar o text vengono convertite dalla tabella codici ANSI/Microsoft Windows (ISO 1252) nella tabella codici di SQL Server. |
OEM (predefinito) |
Converte le colonne con tipo di dati char, varchar o text dalla tabella codici OEM di sistema a quella di SQL Server. |
RAW |
Non vengono eseguite conversioni tra tabelle codici. Si tratta dell'opzione più rapida. |
code_page |
Indica la tabella codici di origine in cui vengono codificati i dati di tipo carattere del file di dati, ad esempio 850. Le versioni importanti precedenti a SQL Server 2016 (13.x) non supportano la tabella codici 65001 (codifica UTF-8). |
FORMAT = { 'CSV' | 'PARQUET' | 'DELTA' }
A partire da SQL Server 2017 (14.x), questo argomento specifica un file di valori delimitati da virgole conforme allo standard RFC 4180 .
A partire da SQL Server 2022 (16.x), sono supportati sia i formati Parquet che Delta.
SELECT *
FROM OPENROWSET(BULK N'D:\XChange\test-csv.csv',
FORMATFILE = N'D:\XChange\test-csv.fmt',
FIRSTROW=2,
FORMAT='CSV') AS cars;
FORMATFILE = 'format_file_path'
Specifica il percorso completo di un file di formato. SQL Server supporta due tipi di file di formato, ovvero XML e non XML.
Un file di formato è necessario per definire i tipi di colonna nel set di risultati. L'unica eccezione è quando SINGLE_CLOB
, SINGLE_BLOB
o SINGLE_NCLOB
è specificato. In tal caso, il file di formato non è obbligatorio.
Per informazioni sui file di formato, vedere Usare un file di formato per l'importazione bulk di dati (SQL Server).For information about format files, see Use a format file to bulk import data (SQL Server).
A partire da SQL Server 2017 (14.x), il format_file_path può trovarsi in Archiviazione BLOB di Azure. Per esempi, vedere Esempi di accesso in blocco ai dati in Archiviazione BLOB di Azure.
FIELDQUOTE = 'field_quote'
A partire da SQL Server 2017 (14.x), questo argomento specifica un carattere usato come carattere di virgolette nel file CSV. Se non specificato, il carattere virgolette ("
) viene usato come carattere di virgolette come definito nello standard RFC 4180 .
Osservazioni:
È possibile usare OPENROWSET
per accedere ai dati remoti da origini dati OLE DB solo se l'opzione del Registro di sistema DisallowAdhocAccess è impostata esplicitamente su 0 per il provider specificato e l'opzione di configurazione avanzata Ad Hoc Distributed Queries è abilitata. Quando queste opzioni non sono impostate, il comportamento predefinito non consente l'accesso ad hoc.
Quando si accede a origini dati OLE DB remote, l'identità di accesso delle connessioni attendibili non viene delegata automaticamente dal server in cui il client è connesso al server su cui viene eseguita una query. È necessario configurare la delega dell'autenticazione.
Se il provider OLE DB supporta più cataloghi e schemi nell'origine dati specificata, è necessario specificare i nomi di catalogo e di schema. I valori per il catalogo e lo schema possono essere omessi quando il provider OLE DB non li supporta. Se il provider supporta solo nomi di schema, è necessario specificare un nome composto da due parti nel formato schema.oggetto. Se il provider supporta solo nomi di catalogo, è necessario specificare un nome composto da tre parti nel formato catalogo.schema.oggetto. È necessario specificare nomi composti da tre parti per le query pass-through che usano il provider OLE DB di SQL Server Native Client. Per altre informazioni, vedere Convenzioni di sintassi Transact-SQL.
OPENROWSET
non accetta variabili per i relativi argomenti.
Qualsiasi chiamata a OPENDATASOURCE
, OPENQUERY
r OPENROWSET
nella clausola FROM
viene valutata separatamente e indipendentemente da qualsiasi altra chiamata a queste funzioni usate come destinazione dell'aggiornamento, anche se alle due chiamate vengono forniti argomenti identici. In particolare, le condizioni di filtro o join applicate al risultato di una di tali chiamate non hanno effetto sui risultati dell'altra.
Usare OPENROWSET con l'opzione BULK
I miglioramenti transact-SQL seguenti supportano la OPENROWSET(BULK...)
funzione :
Una clausola
FROM
usata conSELECT
può chiamareOPENROWSET(BULK...)
anziché un nome di tabella. In questo modo, sono disponibili tutte le funzionalità diSELECT
.OPENROWSET
con l'opzioneBULK
richiede un nome di correlazione, noto anche come alias o variabile di intervallo, nella clausolaFROM
. È possibile specificare alias di colonne. Se non viene specificato un elenco di alias di colonna, il file di formato deve avere nomi di colonna. Se si specificano gli alias di colonna, i nomi di colonna nel file di formato vengono sostituiti, ad esempio:FROM OPENROWSET(BULK...) AS table_alias
FROM OPENROWSET(BULK...) AS table_alias(column_alias,...n)
Importante
Se non si aggiunge ,
AS <table_alias>
verrà restituito l'errore: Msg 491, Level 16, State 1, Line 20 È necessario specificare il nome di correlazione per il set di righe bulk nella clausola from.Un'istruzione
SELECT...FROM OPENROWSET(BULK...)
consente di eseguire query direttamente sui dati in un file, senza importare i dati in una tabella. Le istruzioniSELECT...FROM OPENROWSET(BULK...)
consentono anche di elencare alias di colonna bulk usando un file di formato per specificare nomi di colonna e tipi di dati.L'uso di
OPENROWSET(BULK...)
come tabella di origine in un'istruzioneINSERT
oMERGE
consente di eseguire l'importazione bulk di dati da un file di dati in una tabella di SQL Server. Per altre informazioni, vedere Usare BULK INSERT o OPENROWSET(BULK...) per importare dati in SQL Server.Quando l'opzione
OPENROWSET BULK
viene usata con un'istruzioneINSERT
, laBULK
clausola supporta hint di tabella. Oltre agli hint di tabella normali, ad esempioTABLOCK
, la clausolaBULK
può accettare gli hint di tabella specializzati seguenti:IGNORE_CONSTRAINTS
(ignora solo i vincoliCHECK
eFOREIGN KEY
),IGNORE_TRIGGERS
,KEEPDEFAULTS
eKEEPIDENTITY
. Per ulteriori informazioni, vedere Hint di tabella (Transact-SQL).Per informazioni su come usare le istruzioni
INSERT...SELECT * FROM OPENROWSET(BULK...)
, vedere Importazione ed esportazione bulk di dati (SQL Server). Per informazioni sui casi in cui le operazioni di inserimento di righe eseguite durante l'importazione in blocco vengono registrate nel log delle transazioni, vedere Prerequisiti per la registrazione minima nell'importazione in blocco.
Nota
Quando si usa OPENROWSET
, è importante comprendere come SQL Server gestisce la rappresentazione. Per informazioni sulle considerazioni sulla sicurezza, vedere Usare BULK INSERT o OPENROWSET(BULK...) per importare dati in SQL Server.
Importazione bulk di dati SQLCHAR, SQLNCHAR o SQLBINARY
OPENROWSET(BULK...)
presuppone che, se non specificato, la lunghezza massima di SQLCHAR
, SQLNCHAR
o SQLBINARY
i dati non superino 8.000 byte. Se i dati importati si trovano in un campo dati LOB contenente qualsiasi oggetto varchar(max), nvarchar(max)o varbinary(max) che supera 8.000 byte, è necessario utilizzare un file di formato XML che definisce la lunghezza massima per il campo dati. Per specificare la lunghezza massima, modificare il file di formato dichiarando l'attributo MAX_LENGTH.
Nota
Un file di formato generato automaticamente non specifica la lunghezza o la lunghezza massima per un campo LOB. Tuttavia, è possibile modificare un file di formato e specificare la lunghezza o la lunghezza massima manualmente.
Esportazione o importazione in massa di documenti SQLXML
Per l'esportazione o l'importazione bulk di dati SQLXML, utilizzare uno dei tipi di dati seguenti nel file di formato.
Tipo di dati | Effetto |
---|---|
SQLCHAR oppure SQLVARYCHAR |
I dati vengono inviati nella tabella codici client o nella tabella codici implicita dalle regole di confronto. |
SQLNCHAR oppure SQLNVARCHAR |
I dati vengono inviati in formato Unicode. |
SQLBINARY oppure SQLVARYBIN |
I dati vengono inviati senza conversione. |
Autorizzazioni
Le autorizzazioni OPENROWSET
sono determinate dalle autorizzazioni del nome utente che viene passato al provider OLE DB. L'uso dell'opzione BULK
richiede l'autorizzazione ADMINISTER BULK OPERATIONS
o ADMINISTER DATABASE BULK OPERATIONS
.
Esempi
In questa sezione vengono forniti esempi generali per illustrare come usare OPENROWSET.
R. Usare OPENROWSET con SELECT e il provider OLE DB di SQL Server Native Client
Si applica solo a: SQL Server.
SQL Server Native Client (spesso abbreviato SNAC) è stato rimosso da SQL Server 2022 (16.x) e da SQL Server Management Studio 19 (SSMS). Il provider OLE DB di SQL Server Native Client (SQLNCLI o SQLNCLI11) e il provider OLE DB legacy Microsoft per SQL Server (SQLOLEDB) non sono consigliati per lo sviluppo di nuove applicazioni. In futuro, passare al nuovo driver Microsoft OLE DB (MSOLEDBSQL) per SQL Server.
Nell'esempio seguente viene usato il provider OLE DB di SQL Server Native Client per accedere alla HumanResources.Department
tabella nel AdventureWorks2022
database nel server Seattle1
remoto . (L'utilizzo di SQLNCLI e SQL Server reindirizza alla versione più recente del provider OLE DB per SQL Server Native Client.) Viene usata un'istruzione SELECT
per definire il set di righe restituito. La stringa del provider contiene le parole chiave Server
e Trusted_Connection
. Queste parole chiave sono riconosciute dal provider OLE DB di SQL Server Native Client.
SELECT a.*
FROM OPENROWSET(
'SQLNCLI', 'Server=Seattle1;Trusted_Connection=yes;',
'SELECT GroupName, Name, DepartmentID
FROM AdventureWorks2022.HumanResources.Department
ORDER BY GroupName, Name'
) AS a;
B. Usare il provider Microsoft OLE DB per Jet
Si applica solo a: SQL Server.
Nell'esempio seguente viene ottenuto l'accesso alla tabella Customers
del database Northwind
di Microsoft Access tramite il provider Microsoft OLE DB per Jet.
Nota
In questo esempio si presuppone che Sia installato Microsoft Access. Per eseguire questo esempio, è necessario installare il Northwind
database.
SELECT CustomerID, CompanyName
FROM OPENROWSET(
'Microsoft.Jet.OLEDB.4.0',
'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';
'admin';'',
Customers
);
Importante
Database SQL di Azure supporta solo la lettura da Archiviazione BLOB di Azure.
C. Usare OPENROWSET e un'altra tabella in un INNER JOIN
Si applica solo a: SQL Server.
Nell'esempio seguente vengono selezionati tutti i dati della tabella Customers
dell'istanza locale del database Northwind
di SQL Server e della tabella Orders
del database Northwind
di Access archiviato nello stesso computer.
Nota
Nell'esempio si presuppone che Access sia installato. Per eseguire questo esempio, è necessario installare il Northwind
database.
USE Northwind;
GO
SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c
INNER JOIN OPENROWSET(
'Microsoft.Jet.OLEDB.4.0',
'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';'admin';'',
Orders) AS o
ON c.CustomerID = o.CustomerID;
Importante
Database SQL di Azure supporta solo la lettura da Archiviazione BLOB di Azure.
D. Usare OPENROWSET per ESEGUIRE BULK INSERT i dati dei file in una colonna varbinary(max)
Si applica solo a: SQL Server.
Nell'esempio seguente viene creata una tabella di piccole dimensioni a scopo dimostrativo e vengono inseriti dati di file da un file denominato Text1.txt
nella C:
directory radice in una colonna 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
Importante
Database SQL di Azure supporta solo la lettura da Archiviazione BLOB di Azure.
E. Usare il provider OPENROWSET BULK con un file di formato per recuperare righe da un file di testo
Si applica solo a: SQL Server.
Nell'esempio seguente viene utilizzato un file di formato per recuperare le righe da un file di testo delimitato da tabulazioni, values.txt
contenente i dati seguenti:
1 Data Item 1
2 Data Item 2
3 Data Item 3
Il file di formato, values.fmt
, descrive le colonne in 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
Questa query recupera i dati:
SELECT a.* FROM OPENROWSET(
BULK 'C:\test\values.txt',
FORMATFILE = 'C:\test\values.fmt'
) AS a;
Importante
Database SQL di Azure supporta solo la lettura da Archiviazione BLOB di Azure.
F. Specificare un file di formato e una tabella codici
Si applica solo a: SQL Server.
Nell'esempio seguente viene illustrato come usare contemporaneamente le opzioni del file di formato e della tabella codici.
INSERT INTO MyTable
SELECT a.* FROM OPENROWSET (
BULK N'D:\data.csv',
FORMATFILE = 'D:\format_no_collation.txt',
CODEPAGE = '65001'
) AS a;
G. Accedere ai dati da un file CSV con un file di formato
Si applica solo a: SQL Server 2017 (14.x) e versioni successive.
SELECT * FROM OPENROWSET(
BULK N'D:\XChange\test-csv.csv',
FORMATFILE = N'D:\XChange\test-csv.fmt',
FIRSTROW = 2,
FORMAT = 'CSV'
) AS cars;
Importante
Database SQL di Azure supporta solo la lettura da Archiviazione BLOB di Azure.
H. Accedere ai dati da un file CSV senza un file di formato
Si applica solo a: SQL Server.
SELECT * FROM OPENROWSET(
BULK 'C:\Program Files\Microsoft SQL Server\MSSQL14.CTP1_1\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'
);
Importante
Il driver ODBC deve essere a 64 bit. Aprire la scheda Driver dell'applicazione Connetti a un'origine dati ODBC (Importazione/Esportazione guidata SQL Server) in Windows per verificarlo. È disponibile a 32 bit Microsoft Text Driver (*.txt, *.csv)
che non funzionerà con una versione a 64 bit di sqlservr.exe
.
I. Accedere ai dati da un file archiviato in Archiviazione BLOB di Azure
Si applica solo a: SQL Server 2017 (14.x) e versioni successive.
In SQL Server 2017 (14.x) e versioni successive, nell'esempio seguente viene usata un'origine dati esterna che punta a un contenitore in un account di archiviazione di Azure e a credenziali con ambito database create per una firma di accesso condiviso.
SELECT * FROM OPENROWSET(
BULK 'inv-2017-01-19.csv',
DATA_SOURCE = 'MyAzureInvoices',
SINGLE_CLOB
) AS DataFile;
Per esempi completiOPENROWSET
, inclusa la configurazione delle credenziali e dell'origine dati esterna, vedere Esempi di accesso in blocco ai dati in Archiviazione BLOB di Azure.
J. Importare in una tabella da un file archiviato in Archiviazione BLOB di Azure
L'esempio seguente illustra come usare il OPENROWSET
comando per caricare dati da un file CSV in un percorso di archiviazione BLOB di Azure in cui è stata creata la chiave di firma di accesso condiviso. La posizione di Archiviazione BLOB di Azure è configurata come origine dati esterna. Questa operazione richiede credenziali con ambito database che usano una firma di accesso condiviso crittografata con una chiave master nel database utente.
-- 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 = 'YourStrongPassword1';
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;
Importante
Database SQL di Azure supporta solo la lettura da Archiviazione BLOB di Azure.
K. Usare un'identità gestita per un'origine esterna
si applica a: Istanza gestita di SQL di Azure e database SQL di Azure
L'esempio seguente crea una credenziale usando un'identità gestita, crea un'origine esterna e quindi carica i dati da un file CSV ospitato nell'origine esterna.
Creare prima di tutto le credenziali e specificare l'archiviazione BLOB come origine esterna:
CREATE DATABASE SCOPED CREDENTIAL sampletestcred
WITH IDENTITY = 'MANAGED IDENTITY';
CREATE EXTERNAL DATA SOURCE SampleSource
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://****************.blob.core.windows.net/curriculum',
CREDENTIAL = sampletestcred
);
Caricare quindi i dati dal file CSV ospitato nell'archivio BLOB:
SELECT * FROM OPENROWSET(
BULK 'Test - Copy.csv',
DATA_SOURCE = 'SampleSource',
SINGLE_CLOB
) as test;
Importante
Database SQL di Azure supporta solo la lettura da Archiviazione BLOB di Azure.
.L Usare OPENROWSET per accedere a diversi file Parquet usando l'archiviazione oggetti compatibile con S3
Si applica a: SQL Server 2022 (16.x) e versioni successive.
L'esempio seguente usa l'accesso a diversi file Parquet da un percorso diverso, tutti archiviati nell'archivio oggetti compatibile con 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;
M. Usare OPENROWSET per accedere a diversi file Delta da Azure Data Lake Gen2
Si applica a: SQL Server 2022 (16.x) e versioni successive.
In questo esempio il contenitore della tabella dati è denominato Contoso
e si trova in un account di archiviazione di 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;
Altri esempi
Per altri esempi che illustrano l'uso INSERT...SELECT * FROM OPENROWSET(BULK...)
di , vedere gli articoli seguenti:
- Esempi di importazione ed esportazione in blocco di documenti XML (SQL Server)
- Mantenere i valori Identity durante l'importazione in blocco dei dati (SQL Server)
- Mantenere i valori Null o i valori predefiniti durante un'importazione in blocco (SQL Server)
- Usare un file di formato per l'importazione in blocco dei dati (SQL Server)
- Usare il formato carattere per importare o esportare dati (SQL Server)
- Usare un file di formato per ignorare una colonna di una tabella (SQL Server)
- Usare un file di formato per escludere un campo dati (SQL Server)
- Usare un file di formato per eseguire il mapping tra le colonne di tabella e i campi del file di dati (SQL Server)
- Eseguire query sulle origini dati usando OPENROWSET in Istanza gestita di SQL di Azure
Contenuto correlato
- DELETE (Transact-SQL)
- Clausola FROM con JOIN, APPLY, PIVOT (Transact-SQL)
- Informazioni sull'importazione e l'esportazione in blocco di dati (SQL Server)
- INSERT (Transact-SQL)
- OPENDATASOURCE (Transact-SQL)
- OPENQUERY (Transact-SQL)
- SELECT (Transact-SQL)
- sp_addlinkedserver (Transact-SQL)
- sp_serveroption (Transact-SQL)
- UPDATE (Transact-SQL)
- WHERE (Transact-SQL)
Si applica a:Warehouse in Microsoft Fabric
La funzione di OPENROWSET
T-SQL legge un contenuto di un file in Azure Data Lake Storage. È possibile leggere i formati di file text/CSV o Parquet.
La funzione OPENROWSET
legge i dati da un file e lo restituisce come set di righe. È OPENROWSET
possibile fare riferimento alla FROM
funzione nella clausola di una query come se fosse un nome di tabella.
Nota
La funzione OPENROWSET
è attualmente in anteprima per Microsoft Fabric.
Questo articolo si applica solo a Microsoft Fabric Warehouse. Esistono differenze funzionali tra la funzione OPENROWSET in Fabric Warehouse e gli elementi dell'endpoint di analisi SQL.
Dettagli e collegamenti a esempi simili su altre piattaforme:
- Per la sintassi di SQL Server, selezionare la versione di SQL Server nell'elenco a discesa della versione.
- Per esempi su Istanza gestita di SQL di Azure, vedere Eseguire query sulle origini dati con OPENROWSET.
- Database SQL di Azure supporta solo la lettura da Archiviazione BLOB di Azure.
- Per informazioni ed esempi con pool SQL serverless in Azure Synapse, vedere Come usare OPENROWSET usando il pool SQL serverless in Azure Synapse Analytics.
- I pool SQL dedicati in Azure Synapse non supportano la
OPENROWSET
funzione.
Sintassi
SELECT <columns>
FROM OPENROWSET(
BULK 'https://<storage>.blob.core.windows.net/path/folder1=*/folder2=*/filename.parquet'
[, FORMAT = ('PARQUET' | 'CSV') ]
-- Text formatting options
[, DATAFILETYPE = {'char' | 'widechar' } ]
[, CODEPAGE = {'ACP' | 'OEM' | 'raw' | '<code_page>' } ]
-- Text/CSV formatting options
[, ROWTERMINATOR = 'row_terminator' ]
[, FIELDTERMINATOR = 'field_terminator' ]
[, FIELDQUOTE = 'string_delimiter' ]
[, ESCAPECHAR = 'escape_char' ]
[, HEADER_ROW = [true|false] ]
[, FIRSTROW = first_row ]
[, LASTROW = last_row ]
-- execution options
[, ROWS_PER_BATCH=number_of_rows]
)
[
WITH ( ( <column_name> <sql_datatype> [ '<column_path>' | <column_ordinal> ] )+ )
]
AS <alias>
Argomenti
BULK 'data_file'
URI dei file di dati i cui dati devono essere letti e restituiti come set di righe. L'URI può fare riferimento ad Archiviazione Azure Data Lake o ad Archiviazione BLOB di Azure.
L'URI può contenere * carattere che rappresenta qualsiasi sequenza di caratteri e consente a OPENROWSET di corrispondere all'URI con il criterio.
Opzioni di formato del file di input BULK
FORMAT = { 'CSV' | 'PARQUET' }
Specifica il formato del file a cui si fa riferimento. Se l'estensione del file nel percorso con .csv, parquet o parq, non è necessario specificare l'opzione FORMAT
. Per esempio:
SELECT *
FROM OPENROWSET(
BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet'
FORMAT = N'CSV') AS cars;
DATAFILETYPE = { 'char' | 'widechar' }
Specifica che OPENROWSET(BULK)
deve leggere il contenuto del file a byte singolo (ASCII, UTF8) o multi byte (UTF16).
Valore DATAFILETYPE | Rappresentazione di tutti i dati |
---|---|
char (impostazione predefinita) | Formato carattere. Per altre informazioni, vedere Usare il formato carattere per importare o esportare dati. |
widechar | Caratteri Unicode. Per altre informazioni, vedere Usare il formato carattere Unicode per importare o esportare dati. |
CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' }
Specifica la tabella codici dei dati contenuti nel file di dati.
CODEPAGE
è rilevante solo se i dati contengono colonne char, varchar o text con valori di carattere superiori a 127 o minori di 32.
Valore CODEPAGE | Descrizione |
---|---|
ACP |
Le colonne con tipo di dati char, varchar o text vengono convertite dalla tabella codici ANSI/Microsoft Windows (ISO 1252) nella tabella codici di SQL Server. |
OEM (predefinito) |
Converte le colonne con tipo di dati char, varchar o text dalla tabella codici OEM di sistema a quella di SQL Server. |
RAW |
Non vengono eseguite conversioni tra tabelle codici. Si tratta dell'opzione più rapida. |
code_page |
Indica la tabella codici di origine in cui vengono codificati i dati di tipo carattere del file di dati, ad esempio 850. Le versioni importanti precedenti a SQL Server 2016 (13.x) non supportano la tabella codici 65001 (codifica UTF-8). |
Opzioni di formattazione testo/CSV
ROWTERMINATOR = 'row_terminator'
Specifica il carattere di terminazione della riga da usare per i file di dati di tipo char e widechar. Il carattere di terminazione della riga predefinito è \r\n
(carattere di nuova riga). Per altre informazioni, vedere Specificare caratteri di terminazione dei campi e delle righe.
FIELDTERMINATOR = 'field_terminator'
Specifica il carattere di terminazione del campo da usare per i file di dati di tipo char e widechar. Il carattere di terminazione del campo predefinito è \t
(carattere di tabulazione). Per altre informazioni, vedere Specificare caratteri di terminazione dei campi e delle righe.
FIELDQUOTE = 'field_quote'
Specifica un carattere utilizzato come carattere di virgoletta nel file CSV. Se non specificato, il carattere virgolette ("
) viene usato come carattere di virgolette come definito nello standard RFC 4180 .
ESCAPE_CHAR = 'char'
Specifica il carattere nel file usato per l'escape di se stesso e di tutti i valori dei delimitatori del file. Se seguito da un valore diverso da se stesso o da uno qualsiasi dei valori dei delimitatori, il carattere di escape viene eliminato durante la lettura del valore.
Il parametro ESCAPECHAR verrà applicato indipendentemente dal fatto che FIELDQUOTE sia o meno abilitato. Non verrà usato per l'escape del carattere virgolette singole. Il carattere di virgolette deve essere impostato come escape con un altro carattere di virgolette. Il carattere di virgolette può essere visualizzato all'interno del valore della colonna solo se il valore è incapsulato con caratteri di virgolette.
HEADER_ROW = { TRUE | FALSE }
Specifica se il file CSV contiene o meno una riga di intestazione. Il valore predefinito è FALSE. Supportato in PARSER_VERSION='2.0'. Se TRUE, i nomi delle colonne verranno letti dalla prima riga in base all'argomento FIRSTROW. Se TRUE e lo schema viene specificato usando WITH, l'associazione dei nomi di colonna verrà eseguita per nome di colonna e non in base alle posizioni degli ordinali.
FIRSTROW = first_row
Specifica il numero della prima riga da caricare. Il valore predefinito è 1. Questo valore indica la prima riga nel file di dati specificato. I numeri di riga sono determinati dal conteggio dei caratteri di terminazione.
FIRSTROW
è basato su 1.
LASTROW = last_row
Specifica il numero dell'ultima riga da caricare. Il valore predefinito è 0. Questo valore indica l'ultima riga nel file di dati specificato.
Opzioni di esecuzione
ROWS_PER_BATCH = rows_per_batch
Specifica il numero approssimativo di righe di dati nel file di dati. Questo valore deve essere dello stesso ordine del numero effettivo di righe.
Per impostazione predefinita, ROWS_PER_BATCH
viene stimata in base alle caratteristiche dei file (numero di file, dimensioni dei file, dimensioni dei tipi di dati restituiti). Specificare ROWS_PER_BATCH = 0
equivale a omettere ROWS_PER_BATCH
.
WITH Schema
Lo schema WITH
specifica le colonne che definiscono il set di risultati della funzione OPENROWSET
. Include definizioni di colonna per ogni colonna che verrà restituita di conseguenza e delinea le regole di mapping che associano le colonne di file sottostanti alle colonne del set di risultati.
<column_name>
Nome della colonna che verrà restituita nel set di righe dei risultati. I dati per questa colonna vengono letti dalla colonna di file sottostante con lo stesso nome, a meno che non venga sottoposto a override da <column_path>
o <column_ordinal>
.
<column_type>
Tipo T-SQL della colonna nel set di risultati. I valori del file sottostante vengono convertiti in questo tipo quando OPENROWSET
restituisce i risultati.
<column_path>
Percorso delimitato da punti (ad esempio $.description.location.lat
) usato per fare riferimento a campi annidati in tipi complessi come Parquet.
<column_ordinal>
Numero che rappresenta l'indice fisico della colonna di cui verrà eseguito il mapping alla colonna nella clausola WITH
.
Osservazioni:
Le funzionalità supportate nell'anteprima corrente sono riepilogate nella tabella:
Caratteristica / Funzionalità | Sostenuto | Non disponibile |
---|---|---|
Formati di file | Parquet, CSV | Delta, Azure Cosmos DB |
Autenticazione | Passthrough EntraID, archiviazione pubblica | SAS/SAK, SPN, Accesso gestito |
Archiviazione | Archiviazione BLOB di Azure, Azure Data Lake Storage | OneLake |
Opzioni | Solo l'URI assoluto completo in OPENROWSET |
DATA_SOURCE |
Partizionamento | È possibile usare la funzione filepath() in una query. |
Esempi
Leggere un file parquet da Archiviazione BLOB di Azure
Nell'esempio seguente è possibile vedere come leggere 100 righe da un file 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'
) AS data;
Leggere un file CSV personalizzato
Nell'esempio seguente è possibile vedere come leggere le righe da un file CSV con una riga di intestazione e i caratteri di terminazione specificati in modo esplicito che separano righe e campi:
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 = ',')
AS data;
Specificare lo schema della colonna di file durante la lettura di un file
Nell'esempio seguente è possibile vedere come specificare in modo esplicito lo schema di riga che verrà restituito come risultato della funzione OPENROWSET:
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)
) AS covid_data;
Leggere set di dati partizionati
Nell'esempio seguente è possibile vedere come usare la funzione filepath()
per leggere le parti dell'URI dal percorso del file corrispondente:
SELECT TOP 10
files.filepath(2) AS area
, files.*
FROM OPENROWSET(
BULK 'https://synapseaisolutionsa.blob.core.windows.net/public/NYC_Property_Sales_Dataset/*_*.csv',
HEADER_ROW = TRUE)
AS files
WHERE files.filepath(1) = '2009';