Nel caso in cui le informazioni da importare fossero in formato testo delimitato e/o fisso abbiamo almeno due possibilità: importare le informazioni utilizzando i potentissimi Data Transformation Service oppure utilizzare le funzionalità di bulk import disponibili "nativamente" con il motore di Sql Server. Delle due, la prima possibilità è particolarmente apprezzabile per la enorme facilità d’utilizzo. Mentre, la seconda, che è quella che prenderemo in considerazione per questo articolo trova il suo punto di forza nella impareggiabile potenza e velocità di elaborazione. Infatti grazie al fatto che le operazioni di bulk import vengono eseguite direttamente all’interno dello stesso processo di Sql Server il file contenente le informazioni di importazione è acceduto direttamente dal motore senza inutili e costosi switch tra processi esterni tra di loro o altri rallentamenti di alcun genere. La sintassi è la seguente:
BULK INSERT [ [ 'database_name'.] [ 'owner' ].] { 'table_name' FROM 'data_file'}
[ WITH
(
[ BATCHSIZE [ = batch_size ] ]
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'code_page' ] ]
[ [ , ] DATAFILETYPE [ =
{ 'char' | 'native'| 'widechar' | 'widenative' } ] ]
[ [ , ] FIELDTERMINATOR [ = 'field_terminator' ] ]
[ [ , ] FIRSTROW [ = first_row ] ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] KEEPIDENTITY ]
[ [ , ] KEEPNULLS ]
[ [ , ] KILOBYTES_PER_BATCH [ = kilobytes_per_batch ] ]
[ [ , ] LASTROW [ = last_row ] ]
[ [ , ] MAXERRORS [ = max_errors ] ]
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]
[ [ , ] ROWS_PER_BATCH [ = rows_per_batch ] ]
[ [ , ] ROWTERMINATOR [ = 'row_terminator' ] ]
[ [ , ] TABLOCK ]
)
]
Ovviamente istruzioni di questo tipo possono essere eseguite anche all’interno di transazioni. In questo caso un eventuale roll-back causerebbe la revoca di tutti i batch inviati al motore relazionale. Ecco due esempi presi dalla documentazione ufficiale:
BULK INSERT Northwind.dbo.[Order Details]
FROM 'f:\orders\lineitem.tbl'
WITH
(
FIELDTERMINATOR = '|',
ROWTERMINATOR = '|\n'
)
Il seguente esempio indica esplicitamente l’invocazione di eventuali trigger associate alle tabelle in cui si stanno importando le informazioni per validare od "accomodare" i dati in tempo reale direttamente durante la stessa fase di inserimento:
BULK INSERT Northwind.dbo.[Order Details]
FROM 'f:\orders\lineitem.tbl'
WITH
(
FIELDTERMINATOR = '|',
ROWTERMINATOR = ':\n',
FIRE_TRIGGERS
)
|