Controllo della verifica dei vincoli tramite operazioni di importazione bulk

Quando si eseguono importazioni bulk di dati, è possibile decidere se applicare o meno i vincoli CHECK e FOREIGN KEY durante l'operazione di importazione. Un vincolo è una regola business applicata a una colonna per definirne i valori validi. Ad esempio, un vincolo per una colonna contenente interni di numeri telefonici richiedere il formato ####. La definizione e la verifica dei vincoli rappresentano il meccanismo standard per applicare l'integrità dei dati. Microsoft consiglia di utilizzare regolarmente la verifica dei vincoli durante un'importazione bulk incrementale.

Talvolta i vincoli possono essere ignorati. Una situazione di questo tipo può verificarsi se i dati di input contengono righe che violano i vincoli. Ignorando i vincoli, è possibile caricare i dati e quindi utilizzare istruzioni Transact-SQL per riorganizzare i dati.

[!NOTA]

Se si ignorano vincoli durante un'operazione di importazione bulk, i dati che violano i vincoli esistenti possono essere inseriti nella tabella. Il vincolo ignorato nella tabella viene pertanto contrassegnato come is_not_trusted nella vista del catalogo sys.check_constraints (per ulteriori informazioni, vedere sys.check_constraints (Transact-SQL)). In un determinato momento sarà necessario controllare i vincoli sull'intera tabella.

Se prima dell'operazione di importazione bulk la tabella non era vuota, il costo della nuova convalida del vincolo potrebbe essere superiore del costo dell'applicazione dei vincoli CHECK ai dati incrementali. In seguito all'importazione di dati con errori, è necessario utilizzare Transact-SQL per riorganizzare i dati importati.

Nota importanteImportante

Quando i vincoli sono disattivati, è possibile che venga applicato un blocco di modifica dello schema per aggiornare i metadati. Questa operazione può interferire con altri comandi, ad esempio la creazione di un indice in linea, o transazioni. È ad esempio possibile che una transazione di isolamento dello snapshot che accede alla tabella di destinazione abbia esito negativo a causa di modifiche DDL simultanee.

Per ulteriori informazioni sui vincoli, vedere Vincoli.

Durante un'operazione di importazione bulk, il comportamento della verifica dei vincoli dipende dal comando utilizzato per l'operazione. Per impostazione predefinita, il comando bcp e l'istruzione BULK INSERT ignorano i vincoli. Per un'istruzione INSERT ... SELECT * FROM OPENROWSET(BULK...), invece, il comportamento predefinito consiste nel verificare i vincoli.

Nella tabella seguente è incluso un riepilogo del comportamento di verifica dei vincoli dei comandi di importazione bulk.

Comando

Comportamento predefinito

bcp

I vincoli vengono ignorati

BULK INSERT

I vincoli vengono ignorati

INSERT ... SELECT * FROM OPENROWSET(BULK...).

I vincoli vengono verificati

Ogni comando di importazione bulk include un qualificatore che consente di modificare le modalità di gestione dei vincoli, come illustrato nelle sezioni seguenti.

Verifica dei vincoli con bcp o BULK INSERT

Per impostazione predefinita, i vincoli vengono ignorati durante un'operazione di importazione bulk eseguita dal comando bcp o dall'istruzione BULK INSERT.

Il comando bcp e l'istruzione BULK INSERT consentono di specificare che i vincoli devono essere applicati durante un'operazione di importazione bulk. L'applicazione dei vincoli provoca il rallentamento dell'operazione di importazione bulk, ma garantisce che tutti i dati inseriti non violino alcun vincolo esistente. Nella tabella seguente è incluso un riepilogo dei qualificatori che è possibile utilizzare per specificare l'applicazione di vincoli durante un'operazione di importazione bulk.

Comando

Qualificatore

Tipo di qualificatore

bcp

-h"CHECK_CONSTRAINTS"

Hint

BULK INSERT

CHECK_CONSTRAINTS

Argomento

Per ulteriori informazioni, vedere Utilità bcp e BULK INSERT (Transact-SQL).

Ignorare i vincoli in INSERT ... SELECT * FROM OPENROWSET(BULK...)

Per impostazione predefinita, l'istruzione INSERT controlla i vincoli CHECK. Tuttavia l'istruzione INSERT SELECT * FROM OPENROWSET(BULK...) consente di ignorare la verifica dei vincoli CHECK. Per ulteriori informazioni su tali vincoli, vedere Vincoli CHECK.

[!NOTA]

Solo i vincoli CHECK possono essere disattivati. Non è possibile disattivare i vincoli UNIQUE, PRIMARY KEY, FOREIGN KEY o NOT NULL.

Nella tabella seguente è incluso un riepilogo dell'hint di tabella per ignorare i vincoli CHECK.

Comando

Qualificatore

Tipo di qualificatore

INSERT ... SELECT * FROM OPENROWSET(BULK...)

WITH (IGNORE_CONSTRAINTS)

Hint di tabella

Nell'esempio seguente viene illustrato l'utilizzo di questo qualificatore. Per ulteriori informazioni sull'hint IGNORE_CONSTRAINTS, vedere Hint di tabella (Transact-SQL).

Verifica dell'avvenuta importazione dei dati

Se si ignorano vincoli in un'operazione di importazione bulk, è possibile identificare in un secondo momento le righe della tabella che violano i vincoli controllando manualmente i dati importati. Per controllare manualmente i dati si possono utilizzare query Transact-SQL o stored procedure che testano le condizioni del vincolo.

[!NOTA]

Per sapere se una tabella è trusted, vedere la colonna is_not_trusted nella vista del catalogo di sys.check_constraints. Per ulteriori informazioni, vedere sys.check_constraints (Transact-SQL).