INSERT (Transact-SQL)INSERT (Transact-SQL)

SI APPLICA A: sìSQL Server sìDatabase SQL di Azure sìAzure SQL Data Warehouse sìParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Consente di aggiungere una o più righe a una tabella o a una vista in SQL ServerSQL Server.Adds one or more rows to a table or a view in SQL ServerSQL Server. Per alcuni esempi, vedere Esempi.For examples, see Examples.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

-- Syntax for SQL Server and Azure SQL Database  

[ WITH <common_table_expression> [ ,...n ] ]  
INSERT   
{  
        [ TOP ( expression ) [ PERCENT ] ]   
        [ INTO ]   
        { <object> | rowset_function_limited   
          [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]  
        }  
    {  
        [ ( column_list ) ]   
        [ <OUTPUT Clause> ]  
        { VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n     ]   
        | derived_table   
        | execute_statement  
        | <dml_table_source>  
        | DEFAULT VALUES   
        }  
    }  
}  
[;]  
  
<object> ::=  
{   
    [ server_name . database_name . schema_name .   
      | database_name .[ schema_name ] .   
      | schema_name .   
    ]  
  table_or_view_name  
}  
  
<dml_table_source> ::=  
    SELECT <select_list>  
    FROM ( <dml_statement_with_output_clause> )   
      [AS] table_alias [ ( column_alias [ ,...n ] ) ]  
    [ WHERE <search_condition> ]  
        [ OPTION ( <query_hint> [ ,...n ] ) ]  
-- External tool only syntax  

INSERT   
{  
    [BULK]  
    { database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }  
    ( <column_definition> )  
    [ WITH (  
        [ [ , ] CHECK_CONSTRAINTS ]  
        [ [ , ] FIRE_TRIGGERS ]  
        [ [ , ] KEEP_NULLS ]  
        [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]  
        [ [ , ] ROWS_PER_BATCH = rows_per_batch ]  
        [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]  
        [ [ , ] TABLOCK ]  
    ) ]  
}  
  
[; ] <column_definition> ::=  
 column_name <data_type>  
    [ COLLATE collation_name ]  
    [ NULL | NOT NULL ]  
  
<data type> ::=   
[ type_schema_name . ] type_name   
    [ ( precision [ , scale ] | max ]  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

INSERT INTO { database_name.schema_name.table_name | schema_name.table_name | table_name }
    [ ( column_name [ ,...n ] ) ]  
    {   
      VALUES ( { NULL | expression } )  
      | SELECT <select_criteria>  
    }  
    [ OPTION ( <query_option> [ ,...n ] ) ]  
[;]  

ArgomentiArguments

WITH <common_table_expression>WITH <common_table_expression>
Specifica il set di risultati denominato temporaneo, noto anche come espressione di tabella comune, definito nell'ambito dell'istruzione INSERT.Specifies the temporary named result set, also known as common table expression, defined within the scope of the INSERT statement. Il set di risultati deriva da un'istruzione SELECT.The result set is derived from a SELECT statement. Per altre informazioni, vedere WITH common_table_expression (Transact-SQL).For more information, see WITH common_table_expression (Transact-SQL).

TOP (expression) [ PERCENT ]TOP (expression) [ PERCENT ]
Specifica il numero o la percentuale di righe casuali che verranno inserite.Specifies the number or percent of random rows that will be inserted. Il valore diexpression può essere specificato come numero o come percentuale di righe.expression can be either a number or a percent of the rows. Per altre informazioni, vedere TOP (Transact-SQL).For more information, see TOP (Transact-SQL).

INTOINTO
Parola chiave facoltativa che può essere specificata tra INSERT e la tabella di destinazione.Is an optional keyword that can be used between INSERT and the target table.

server_nameserver_name
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Nome del server collegato in cui si trova la tabella o la vista.Is the name of the linked server on which the table or view is located. server_name può essere specificato come nome di server collegato o tramite la funzione OPENDATASOURCE.server_name can be specified as a linked server name, or by using the OPENDATASOURCE function.

Quando nome_server è specificato come server collegato, è obbligatorio specificare database_name e schema_name.When server_name is specified as a linked server, database_name and schema_name are required. Quando server_name viene specificato con OPENDATASOURCE, database_name e schema_name possono non essere validi per tutte le origini dati e non essere soggetti alle funzionalità del provider OLE DB che accede all'oggetto remoto.When server_name is specified with OPENDATASOURCE, database_name and schema_name may not apply to all data sources and is subject to the capabilities of the OLE DB provider that accesses the remote object.

database_namedatabase_name
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Nome del database.Is the name of the database.

schema_nameschema_name
Nome dello schema a cui appartiene la tabella o la vista.Is the name of the schema to which the table or view belongs.

table_or view_nametable_or view_name
Nome della tabella o della vista in cui si desidera inserire i dati.Is the name of the table or view that is to receive the data.

Una variabile table, all'interno del proprio ambito, può essere usata come origine di tabella in un'istruzione INSERT.A table variable, within its scope, can be used as a table source in an INSERT statement.

È necessario che la vista a cui viene fatto riferimento in table_or_view_name sia aggiornabile e includa un riferimento esatto a una tabella di base nella clausola FROM della definizione della vista.The view referenced by table_or_view_name must be updatable and reference exactly one base table in the FROM clause of the view. In un'istruzione INSERT eseguita in una vista a più tabelle, ad esempio, è necessario specificare un argomento column_list che faccia riferimento solo alle colonne di una sola tabella di base.For example, an INSERT into a multi-table view must use a column_list that references only columns from one base table. Per altre informazioni sulle viste aggiornabili, vedere CREATE VIEW (Transact-SQL).For more information about updatable views, see CREATE VIEW (Transact-SQL).

rowset_function_limitedrowset_function_limited
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Funzione OPENQUERY o OPENROWSET.Is either the OPENQUERY or OPENROWSET function. L'utilizzo di queste funzioni è soggetto alle funzionalità del provider OLE DB che accede all'oggetto remoto.Use of these functions is subject to the capabilities of the OLE DB provider that accesses the remote object.

WITH ( <table_hint_limited> [... n ] )WITH ( <table_hint_limited> [... n ] )
Specifica uno o più hint di tabella consentiti per una tabella di destinazione.Specifies one or more table hints that are allowed for a target table. La parola chiave WITH e le parentesi sono obbligatorie.The WITH keyword and the parentheses are required.

Le opzioni READPAST, NOLOCK e READUNCOMMITTED non sono consentite.READPAST, NOLOCK, and READUNCOMMITTED are not allowed. Per altre informazioni sugli hint di tabella, vedere Hint di tabella (Transact-SQL).For more information about table hints, see Table Hints (Transact-SQL).

Importante

La funzionalità che consente di specificare gli hint HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD o UPDLOCK su tabelle specificate come destinazione di istruzioni INSERT verrà rimossa a partire da una delle prossime versioni di SQL ServerSQL Server.The ability to specify the HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD, or UPDLOCK hints on tables that are targets of INSERT statements will be removed in a future version of SQL ServerSQL Server. Questi hint non influiscono sulle prestazioni delle istruzioni INSERT.These hints do not affect the performance of INSERT statements. Evitarne l'utilizzo in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui sono attualmente implementati.Avoid using them in new development work, and plan to modify applications that currently use them.

La specifica di un hint TABLOCK in una tabella di destinazione di un'istruzione INSERT equivale alla specifica dell'hint TABLOCKXSpecifying the TABLOCK hint on a table that is the target of an INSERT statement has the same effect as specifying the TABLOCKX hint. poiché determina l'acquisizione di un blocco esclusivo sulla tabella.An exclusive lock is taken on the table.

(column_list)(column_list)
Elenco di una o più colonne in cui inserire i dati.Is a list of one or more columns in which to insert data. Il valore di column_list deve essere racchiuso tra parentesi e delimitato da virgole.column_list must be enclosed in parentheses and delimited by commas.

Se una colonna non è presente nell'elenco column_list, il Motore di databaseDatabase Engine deve essere in grado di fornire un valore in base alla definizione della colonna. In caso contrario, la riga non può essere caricata.If a column is not in column_list, the Motore di databaseDatabase Engine must be able to provide a value based on the definition of the column; otherwise, the row cannot be loaded. Nel Motore di databaseDatabase Engine viene fornito automaticamente un valore se la colonna soddisfa i requisiti seguenti:The Motore di databaseDatabase Engine automatically provides a value for the column if the column:

  • Dispone di una proprietà IDENTITY.Has an IDENTITY property. Viene utilizzato il valore Identity incrementale successivo.The next incremental identity value is used.

  • Include un valore predefinito.Has a default. Viene utilizzato il valore predefinito della colonna.The default value for the column is used.

  • È di tipo timestamp.Has a timestamp data type. Viene utilizzato il valore timestamp corrente.The current timestamp value is used.

  • Ammette i valori Null.Is nullable. Viene utilizzato un valore Null.A null value is used.

  • Colonna calcolata.Is a computed column. Viene utilizzato il valore calcolato.The calculated value is used.

Quando vengono inseriti valori espliciti in una colonna Identity, è necessario usare column_list. L'opzione SET IDENTITY_INSERT ,poi, deve essere impostata su ON per la tabella.column_list must be used when explicit values are inserted into an identity column, and the SET IDENTITY_INSERT option must be ON for the table.

Clausola OUTPUTOUTPUT Clause
Restituisce le righe inserite come parte dell'operazione di inserimento.Returns inserted rows as part of the insert operation. I risultati possono essere restituiti all'applicazione di elaborazione o possono essere inseriti in una tabella o in una variabile di tabella per essere elaborati ulteriormente.The results can be returned to the processing application or inserted into a table or table variable for further processing.

La clausola OUTPUT non è supportata in istruzioni DML che fanno riferimento a viste partizionate locali, viste partizionate distribuite o tabelle remote, né in istruzioni INSERT che contengono un parametro execute_statement.The OUTPUT clause is not supported in DML statements that reference local partitioned views, distributed partitioned views, or remote tables, or INSERT statements that contain an execute_statement. La clausola OUTPUT INTO non è supportata in istruzioni INSERT che contengono una clausola <dml_table_source>.The OUTPUT INTO clause is not supported in INSERT statements that contain a <dml_table_source> clause.

VALUESVALUES
Parola chiave che introduce l'elenco o gli elenchi di valori dei dati da inserire.Introduces the list or lists of data values to be inserted. Deve essere disponibile un valore per ogni colonna in column_list, se specificato, o nella tabella.There must be one data value for each column in column_list, if specified, or in the table. L'elenco di valori deve essere racchiuso tra parentesi.The value list must be enclosed in parentheses.

Se i valori dell'elenco di valori non sono nello stesso ordine delle colonne della tabella o se non è disponibile un valore per ogni colonna della tabella, è necessario usare column_list per specificare in modo esplicito la colonna in cui vengono archiviati i valori inseriti.If the values in the Value list are not in the same order as the columns in the table or do not have a value for each column in the table, column_list must be used to explicitly specify the column that stores each incoming value.

È possibile utilizzare il costruttore di riga di Transact-SQLTransact-SQL, denominato anche costruttore di valori di tabella, per specificare più righe in una singola istruzione INSERT.You can use the Transact-SQLTransact-SQL row constructor (also called a table value constructor) to specify multiple rows in a single INSERT statement. Il costruttore di riga è costituito da una singola clausola VALUES con più elenchi di valori racchiusi tra parentesi e separati da una virgola.The row constructor consists of a single VALUES clause with multiple value lists enclosed in parentheses and separated by a comma. Per altre informazioni, vedere Costruttore di valori di tabella (Transact-SQL).For more information, see Table Value Constructor (Transact-SQL).

DEFAULTDEFAULT
Forza il caricamento nel Motore di databaseDatabase Engine del valore predefinito di una colonna.Forces the Motore di databaseDatabase Engine to load the default value defined for a column. Se per la colonna non è disponibile alcun valore predefinito e la colonna ammette valori NULL, viene inserito un valore NULL.If a default does not exist for the column and the column allows null values, NULL is inserted. Per una colonna definita con tipo di dati timestamp, viene inserito il valore timestamp successivo.For a column defined with the timestamp data type, the next timestamp value is inserted. DEFAULT non è un valore valido per una colonna Identity.DEFAULT is not valid for an identity column.

expressionexpression
Costante, variabile o espressione.Is a constant, a variable, or an expression. L'espressione non può contenere un'istruzione EXECUTE.The expression cannot contain an EXECUTE statement.

Quando si fa riferimento ai tipi di dati dei caratteri Unicode nchar, nvarchar e ntext, è necessario far precedere 'expression' dalla lettera maiuscola 'N'.When referencing the Unicode character data types nchar, nvarchar, and ntext, 'expression' should be prefixed with the capital letter 'N'. Se la lettera "N" non è specificata, in SQL ServerSQL Server la stringa viene convertita in base alla tabella codici corrispondente alle regole di confronto predefinite del database o della colonna.If 'N' is not specified, SQL ServerSQL Server converts the string to the code page that corresponds to the default collation of the database or column. Tutti i caratteri non trovati nella tabella codici vengono persi.Any characters not found in this code page are lost.

derived_tablederived_table
Qualsiasi istruzione SELECT valida che restituisce righe di dati da caricare nella tabella.Is any valid SELECT statement that returns rows of data to be loaded into the table. L'istruzione SELECT non può contenere un'espressione di tabella comune.The SELECT statement cannot contain a common table expression (CTE).

execute_statementexecute_statement
Qualsiasi istruzione EXECUTE valida che restituisce dati con le istruzioni SELECT o READTEXT.Is any valid EXECUTE statement that returns data with SELECT or READTEXT statements. Per altre informazioni, vedere EXECUTE (Transact-SQL).For more information, see EXECUTE (Transact-SQL).

Le opzioni RESULT SETS dell'istruzione EXECUTE non possono essere specificate in un'istruzione INSERT...EXEC.The RESULT SETS options of the EXECUTE statement cannot be specified in an INSERT...EXEC statement.

Se con INSERT si usa execute_statement, ogni set di risultati deve essere compatibile con le colonne nella tabella o in column_list.If execute_statement is used with INSERT, each result set must be compatible with the columns in the table or in column_list.

È possibile usare execute_statement per eseguire stored procedure nello stesso server o in un server remoto.execute_statement can be used to execute stored procedures on the same server or a remote server. Viene eseguita la procedura nel server remoto e i set di risultati vengono restituiti al server locale e caricati nella tabella relativa.The procedure in the remote server is executed, and the result sets are returned to the local server and loaded into the table in the local server. In una transazione distribuita execute_statement non può essere eseguito a fronte di un server collegato di loopback quando per la connessione è abilitato MARS (Multiple Active Result Set).In a distributed transaction, execute_statement cannot be issued against a loopback linked server when the connection has multiple active result sets (MARS) enabled.

Se execute_statement restituisce dati con l'istruzione READTEXT, ogni istruzione READTEXT può restituire dati per un valore massimo di 1 MB (1024 KB).If execute_statement returns data with the READTEXT statement, each READTEXT statement can return a maximum of 1 MB (1024 KB) of data. È anche possibile usare execute_statement con procedure estese.execute_statement can also be used with extended procedures. execute_statement inserisce i dati restituiti dal thread principale della procedura estesa. Gli output dei thread diversi da quello principale, tuttavia, non vengono inseriti.execute_statement inserts the data returned by the main thread of the extended procedure; however, output from threads other than the main thread are not inserted.

Un parametro con valori di tabella non può essere specificato come destinazione di un'istruzione INSERT EXEC, ma può essere specificato come origine nella stringa INSERT EXEC o nella stored procedure.You cannot specify a table-valued parameter as the target of an INSERT EXEC statement; however, it can be specified as a source in the INSERT EXEC string or stored-procedure. Per altre informazioni, vedere Usare parametri con valori di tabella (Motore di database).For more information, see Use Table-Valued Parameters (Database Engine).

<dml_table_source><dml_table_source>
Specifica che le righe inserite nella tabella di destinazione sono quelle restituite dalla clausola OUTPUT di un'istruzione INSERT, UPDATE, DELETE o MERGE, facoltativamente filtrate da una clausola WHERE.Specifies that the rows inserted into the target table are those returned by the OUTPUT clause of an INSERT, UPDATE, DELETE, or MERGE statement, optionally filtered by a WHERE clause. Se si specifica <dml_table_source>, la destinazione dell'istruzione INSERT esterna deve soddisfare le restrizioni seguenti:If <dml_table_source> is specified, the target of the outer INSERT statement must meet the following restrictions:

  • Deve essere una tabella di base e non una vista.It must be a base table, not a view.

  • Non può essere una tabella remota.It cannot be a remote table.

  • Non può includere trigger definiti.It cannot have any triggers defined on it.

  • Non può partecipare ad alcuna relazione di chiave primaria/chiave esterna.It cannot participate in any primary key-foreign key relationships.

  • Non può partecipare alla replica di tipo merge né a sottoscrizioni aggiornabili per la replica transazionale.It cannot participate in merge replication or updatable subscriptions for transactional replication.

Il livello di compatibilità del database deve essere impostato su 100 o più.The compatibility level of the database must be set to 100 or higher. Per altre informazioni, vedere Clausola OUTPUT (Transact-SQL).For more information, see OUTPUT Clause (Transact-SQL).

<select_list><select_list>
Elenco delimitato da virgole che specifica le colonne restituite dalla clausola OUTPUT da inserire.Is a comma-separated list specifying which columns returned by the OUTPUT clause to insert. Le colonne in <select_list> devono essere compatibili con le colonne in cui vengono inseriti i valori.The columns in <select_list> must be compatible with the columns into which values are being inserted. <select_list> non può fare riferimento a funzioni di aggregazione né a TEXTPTR.<select_list> cannot reference aggregate functions or TEXTPTR.

Nota

Qualsiasi variabile elencata nell'elenco SELECT fa riferimento ai rispettivi valori originali, indipendentemente da qualsiasi modifica apportata a tali valori in <dml_statement_with_output_clause>.Any variables listed in the SELECT list refer to their original values, regardless of any changes made to them in <dml_statement_with_output_clause>.

<dml_statement_with_output_clause><dml_statement_with_output_clause>
Istruzione INSERT, UPDATE, DELETE o MERGE valida che restituisce le righe interessate in una clausola OUTPUT.Is a valid INSERT, UPDATE, DELETE, or MERGE statement that returns affected rows in an OUTPUT clause. L'istruzione non può contenere una clausola WITH e non può avere come destinazione tabelle remote o viste partizionate.The statement cannot contain a WITH clause, and cannot target remote tables or partitioned views. Se si specifica UPDATE o DELETE, non può trattarsi di un'istruzione UPDATE o DELETE basata su cursori.If UPDATE or DELETE is specified, it cannot be a cursor-based UPDATE or DELETE. Non è possibile fare riferimento alle righe di origine come istruzioni DML nidificate.Source rows cannot be referenced as nested DML statements.

WHERE <search_condition>WHERE <search_condition>
Qualsiasi clausola WHERE contenente un valore valido per <search_condition> in grado di filtrare le righe restituite da <dml_statement_with_output_clause>.Is any WHERE clause containing a valid <search_condition> that filters the rows returned by <dml_statement_with_output_clause>. Per altre informazioni, vedere Condizione di ricerca(Transact-SQL).For more information, see Search Condition (Transact-SQL). Se usato in questo contesto, <search_condition> non può contenere sottoquery, funzioni scalari definite dall'utente che eseguono l'accesso ai dati, funzioni di aggregazione, TEXTPTR o predicati di ricerca full-text.When used in this context, <search_condition> cannot contain subqueries, scalar user-defined functions that perform data access, aggregate functions, TEXTPTR, or full-text search predicates.

DEFAULT VALUESDEFAULT VALUES
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Forza l'inserimento nella nuova riga dei valori predefiniti associati a ogni colonna.Forces the new row to contain the default values defined for each column.

BULKBULK
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Utilizzato dagli strumenti esterni per caricare un flusso di dati binario.Used by external tools to upload a binary data stream. Questa opzione non è destinata all'uso con strumenti quali SQL Server Management StudioSQL Server Management Studio, SQLCMD, OSQL o API di accesso ai dati come SQL ServerSQL Server Native Client.This option is not intended for use with tools such as SQL Server Management StudioSQL Server Management Studio, SQLCMD, OSQL, or data access application programming interfaces such as SQL ServerSQL Server Native Client.

FIRE_TRIGGERSFIRE_TRIGGERS
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Specifica che gli eventuali trigger di inserimento definiti nella tabella di destinazione vengano eseguiti durante l'operazione di caricamento del flusso di dati binario.Specifies that any insert triggers defined on the destination table execute during the binary data stream upload operation. Per altre informazioni, vedere BULK INSERT (Transact-SQL).For more information, see BULK INSERT (Transact-SQL).

CHECK_CONSTRAINTSCHECK_CONSTRAINTS
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Specifica che tutti i vincoli sulla tabella o sulla vista di destinazione devono essere controllati durante l'operazione di caricamento del flusso di dati binario.Specifies that all constraints on the target table or view must be checked during the binary data stream upload operation. Per altre informazioni, vedere BULK INSERT (Transact-SQL).For more information, see BULK INSERT (Transact-SQL).

KEEPNULLSKEEPNULLS
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Specifica che le colonne vuote devono mantenere un valore null durante l'operazione di caricamento del flusso di dati binario.Specifies that empty columns should retain a null value during the binary data stream upload operation. Per altre informazioni, vedere Mantenere i valori Null o usare i valori predefiniti durante l'importazione in blocco (SQL Server).For more information, see Keep Nulls or Use Default Values During Bulk Import (SQL Server).

KILOBYTES_PER_BATCH = kilobytes_per_batchKILOBYTES_PER_BATCH = kilobytes_per_batch
Specifica il numero approssimativo di kilobyte (KB) di dati per ogni batch come kilobytes_per_batch.Specifies the approximate number of kilobytes (KB) of data per batch as kilobytes_per_batch. Per altre informazioni, vedere BULK INSERT (Transact-SQL).For more information, see BULK INSERT (Transact-SQL).

ROWS_PER_BATCH =rows_per_batchROWS_PER_BATCH =rows_per_batch
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Indica il numero approssimativo di righe di dati nel flusso di dati binario.Indicates the approximate number of rows of data in the binary data stream. Per altre informazioni, vedere BULK INSERT (Transact-SQL).For more information, see BULK INSERT (Transact-SQL).

Nota

Se non viene specificato un elenco di colonne, viene generato un errore di sintassi.A syntax error is raised if a column list is not provided.

RemarksRemarks

Per informazioni specifiche sull'inserimento di dati in tabelle grafici SQL, vedere INSERT (grafico SQL).For information specific to inserting data into SQL graph tables, see INSERT (SQL Graph).

Procedure consigliateBest Practices

Usare la funzione @@ROWCOUNT per restituire il numero di righe inserite nell'applicazione client.Use the @@ROWCOUNT function to return the number of inserted rows to the client application. Per altre informazioni, vedere @@ROWCOUNT (Transact-SQL).For more information, see @@ROWCOUNT (Transact-SQL).

Procedure consigliate per l'importazione bulk di datiBest Practices for Bulk Importing Data

Uso di INSERT INTO...SELECT per eseguire l'importazione bulk dei dati con registrazione minimaUsing INSERT INTO...SELECT to Bulk Import Data with Minimal Logging

È possibile usare INSERT INTO <target_table> SELECT <columns> FROM <source_table> per trasferire in modo efficiente un numero elevato di righe da una tabella, ad esempio una tabella di staging, in un'altra tabella con registrazione minima.You can use INSERT INTO <target_table> SELECT <columns> FROM <source_table> to efficiently transfer a large number of rows from one table, such as a staging table, to another table with minimal logging. La registrazione minima può migliorare le prestazioni dell'istruzione e ridurre la possibilità che l'operazione riempia lo spazio del log delle transazioni disponibile durante la transazione.Minimal logging can improve the performance of the statement and reduce the possibility of the operation filling the available transaction log space during the transaction.

Per utilizzare la registrazione minima con questa istruzione, sono necessari i requisiti seguenti:Minimal logging for this statement has the following requirements:

  • Il modello di recupero del database deve essere impostato sul modello con registrazione minima o con registrazione minima delle operazioni bulk.The recovery model of the database is set to simple or bulk-logged.

  • La tabella di destinazione deve essere un heap vuoto o non vuoto.The target table is an empty or nonempty heap.

  • La tabella di destinazione non deve essere utilizzata nella replica.The target table is not used in replication.

  • L'hint TABLOCK deve essere specificato per la tabella di destinazione.The TABLOCK hint is specified for the target table.

Per le righe inserite in un heap come risultato di un'azione di inserimento in un'istruzione MERGE può essere eseguita la registrazione minima.Rows that are inserted into a heap as the result of an insert action in a MERGE statement may also be minimally logged.

A differenza dell'istruzione BULK INSERT, che contiene un blocco di aggiornamento bulk meno restrittivo, l'istruzione INSERT INTO...SELECT con l'hint TABLOCK contiene un blocco esclusivo (X) sulla tabellaUnlike the BULK INSERT statement, which holds a less restrictive Bulk Update lock, INSERT INTO...SELECT with the TABLOCK hint holds an exclusive (X) lock on the table. che non consente di inserire righe utilizzando operazioni di inserimento parallele.This means that you cannot insert rows using parallel insert operations.

Utilizzo di OPENROWSET e BULK per l'importazione bulk dei datiUsing OPENROWSET and BULK to Bulk Import Data

La funzione OPENROWSET può accettare gli hint di tabella seguenti i quali supportano le ottimizzazioni per il caricamento bulk con l'istruzione INSERT:The OPENROWSET function can accept the following table hints, which provide bulk-load optimizations with the INSERT statement:

  • L'hint TABLOCK può ridurre al minimo il numero di record del log per l'operazione di inserimento.The TABLOCK hint can minimize the number of log records for the insert operation. Per il database è necessario impostare il modello di recupero con registrazione minima o con registrazione minima delle operazioni bulk. La tabella di destinazione non può inoltre essere utilizzata nella replica.The recovery model of the database must be set to simple or bulk-logged and the target table cannot be used in replication. Per altre informazioni, vedere Prerequisiti per la registrazione minima nell'importazione bulk.For more information, see Prerequisites for Minimal Logging in Bulk Import.

  • Il controllo dei vincoli FOREIGN KEY e CHECK può essere disabilitato temporaneamente specificando l'hint IGNORE_CONSTRAINTS.The IGNORE_CONSTRAINTS hint can temporarily disable FOREIGN KEY and CHECK constraint checking.

  • L'esecuzione dei trigger può essere disabilitata temporaneamente specificando l'hint IGNORE_TRIGGERS.The IGNORE_TRIGGERS hint can temporarily disable trigger execution.

  • L'hint KEEPDEFAULTS consente l'inserimento del valore predefinito di una colonna di tabella, se disponibile, al posto del valore NULL quando nel record di dati non è presente un valore per la colonna.The KEEPDEFAULTS hint allows the insertion of a table column's default value, if any, instead of NULL when the data record lacks a value for the column.

  • L'hint KEEPIDENTITY consente l'utilizzo dei valori Identity presenti nel file di dati importato per la colonna Identity nella tabella di destinazione.The KEEPIDENTITY hint allows the identity values in the imported data file to be used for the identity column in the target table.

Queste ottimizzazioni sono simili a quelle disponibili con il comando BULK INSERT.These optimizations are similar to those available with the BULK INSERT command. Per altre informazioni, vedere Hint di tabella (Transact-SQL).For more information, see Table Hints (Transact-SQL).

Tipi di datiData Types

Quando si inseriscono righe, considerare il comportamento dei tipi di dati seguenti:When you insert rows, consider the following data type behavior:

  • Se un valore viene caricato in colonne di tipo char, varchar o varbinary, il riempimento o il troncamento degli spazi vuoti finali (spazi per i tipi di dati char e varchar, zeri per varbinary) viene determinato dall'impostazione SET ANSI_PADDING definita per la colonna alla creazione della tabella.If a value is being loaded into columns with a char, varchar, or varbinary data type, the padding or truncation of trailing blanks (spaces for char and varchar, zeros for varbinary) is determined by the SET ANSI_PADDING setting defined for the column when the table was created. Per altre informazioni, vedere SET ANSI_PADDING (Transact-SQL).For more information, see SET ANSI_PADDING (Transact-SQL).

    Nella tabella seguente vengono descritte le operazioni predefinite per SET ANSI_PADDING OFF.The following table shows the default operation for SET ANSI_PADDING OFF.

    Tipo di datiData type Operazione predefinitaDefault operation
    charchar Il valore viene riempito con spazi fino alla larghezza di colonna specificata.Pad value with spaces to the defined width of column.
    varcharvarchar Gli spazi finali vengono rimossi fino all'ultimo carattere diverso dallo spazio o fino al carattere di spazio singolo per le stringhe composte da soli spazi.Remove trailing spaces to the last non-space character or to a single-space character for strings made up of only spaces.
    varbinaryvarbinary Gli zero finali vengono rimossi.Remove trailing zeros.
  • Se una stringa vuota (' ') viene caricata in una colonna di tipo varchar o text, l'operazione predefinita prevede il caricamento di una stringa di lunghezza zero.If an empty string (' ') is loaded into a column with a varchar or text data type, the default operation is to load a zero-length string.

  • L'inserimento di un valore Null in una colonna di tipo text o image non consente di creare un puntatore di testo valido né di preallocare una pagina di testo da 8 KB.Inserting a null value into a text or image column does not create a valid text pointer, nor does it preallocate an 8-KB text page.

  • Nelle colonne di tipo uniqueidentifier vengono archiviati valori binari a 16 byte con una formattazione speciale.Columns created with the uniqueidentifier data type store specially formatted 16-byte binary values. Diversamente dalle colonne Identity, il Motore di databaseDatabase Engine non genera automaticamente valori per le colonne di tipo uniqueidentifier.Unlike with identity columns, the Motore di databaseDatabase Engine does not automatically generate values for columns with the uniqueidentifier data type. Durante un'operazione di inserimento è possibile usare variabili di tipo uniqueidentifier e costanti stringa nel formato xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 caratteri inclusi i trattini, dove x è una cifra esadecimale compresa nell'intervallo 0-9 o a-f) per le colonne di tipo uniqueidentifier.During an insert operation, variables with a data type of uniqueidentifier and string constants in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 characters including hyphens, where x is a hexadecimal digit in the range 0-9 or a-f) can be used for uniqueidentifier columns. 6F9619FF-8B86-D011-B42D-00C04FC964FF, ad esempio, è un valore valido per una variabile o una colonna di tipouniqueidentifier.For example, 6F9619FF-8B86-D011-B42D-00C04FC964FF is a valid value for a uniqueidentifier variable or column. Per ottenere un ID univoco globale (GUID), usare la funzione NEWID().Use the NEWID() function to obtain a globally unique ID (GUID).

Inserimento di valori in colonne di tipo definito dall'utenteInserting Values into User-Defined Type Columns

Per inserire valori in colonne di tipo definito dall'utente è possibile effettuare una delle operazioni indicate di seguito:You can insert values in user-defined type columns by:

  • Specificare un valore del tipo definito dall'utente.Supplying a value of the user-defined type.

  • Specificando un valore in un tipo di dati di sistema SQL ServerSQL Server, a condizione che i tipi definiti dall'utente supportino la conversione implicita o esplicita da quel tipo.Supplying a value in a SQL ServerSQL Server system data type, as long as the user-defined type supports implicit or explicit conversion from that type. L'esempio seguente illustra come inserire un valore in una colonna del tipo definito dall'utente Point tramite conversione esplicita da una stringa.The following example shows how to insert a value in a column of user-defined type Point, by explicitly converting from a string.

    INSERT INTO Cities (Location)  
    VALUES ( CONVERT(Point, '12.3:46.2') );  
    

    È inoltre possibile specificare un valore binario senza eseguirne la conversione esplicita, perché tutti i tipi definiti dall'utente possono essere convertiti in modo implicito dal tipo binario.A binary value can also be supplied without performing explicit conversion, because all user-defined types are implicitly convertible from binary.

  • Chiamare una funzione definita dall'utente che restituisce un valore con il tipo definito dall'utente.Calling a user-defined function that returns a value of the user-defined type. Nell'esempio seguente viene utilizzata la funzione definita dall'utente CreateNewPoint() per creare un nuovo valore con il tipo definito dall'utente Point e inserire tale valore nella tabella Cities.The following example uses a user-defined function CreateNewPoint() to create a new value of user-defined type Point and insert the value into the Cities table.

    INSERT INTO Cities (Location)  
    VALUES ( dbo.CreateNewPoint(x, y) );  
    

Gestione degli erroriError Handling

È possibile implementare la gestione degli errori per l'istruzione INSERT specificando l'istruzione in un costrutto TRY...CATCH.You can implement error handling for the INSERT statement by specifying the statement in a TRY...CATCH construct.

Se un'istruzione INSERT viola un vincolo o una regola oppure il valore non è compatibile con il tipo di dati della colonna, l'istruzione ha esito negativo e viene restituito un messaggio di errore.If an INSERT statement violates a constraint or rule, or if it has a value incompatible with the data type of the column, the statement fails and an error message is returned.

Se l'istruzione INSERT carica più righe tramite SELECT o EXECUTE e i valori caricati violano una regola o un vincolo, l'istruzione viene arrestata e non viene caricata alcuna riga.If INSERT is loading multiple rows with SELECT or EXECUTE, any violation of a rule or constraint that occurs from the values being loaded causes the statement to be stopped, and no rows are loaded.

Quando un'istruzione INSERT rileva un errore aritmetico (overflow, divisione per zero o errore di dominio) durante la valutazione di un'espressione, l'errore viene gestito dal Motore di databaseDatabase Engine come se l'opzione SET ARITHABORT fosse impostata su ON.When an INSERT statement encounters an arithmetic error (overflow, divide by zero, or a domain error) occurring during expression evaluation, the Motore di databaseDatabase Engine handles these errors as if SET ARITHABORT is set to ON. Il batch viene arrestato e viene restituito un messaggio di errore.The batch is stopped, and an error message is returned. Quando un'istruzione INSERT, DELETE o UPDATE rileva un errore aritmetico (un errore di overflow, una divisione per zero o un errore di dominio) durante la valutazione di un'espressione, se SET ARITHABORT e SET ANSI_WARNINGS sono impostate su ON, SQL ServerSQL Server inserisce o aggiorna un valore Null.During expression evaluation when SET ARITHABORT and SET ANSI_WARNINGS are OFF, if an INSERT, DELETE or UPDATE statement encounters an arithmetic error, overflow, divide-by-zero, or a domain error, SQL ServerSQL Server inserts or updates a NULL value. Se la colonna di destinazione non ammette valori Null, l'operazione di inserimento o aggiornamento ha esito negativo e viene generato un errore per l'utente.If the target column is not nullable, the insert or update action fails and the user receives an error.

InteroperabilitàInteroperability

Se viene definito un trigger INSTEAD OF nelle azioni INSERT eseguite su una tabella o vista, viene eseguito il trigger anziché l'istruzione INSERT.When an INSTEAD OF trigger is defined on INSERT actions against a table or view, the trigger executes instead of the INSERT statement. Per altre informazioni sui trigger INSTEAD OF, vedere CREATE TRIGGER (Transact-SQL).For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

Limitazioni e restrizioniLimitations and Restrictions

Quando si inseriscono valori in tabelle remote e non tutti i valori per tutte le colonne vengono specificati, è necessario identificare le colonne in cui devono essere inseriti i valori specificati.When you insert values into remote tables and not all values for all columns are specified, you must identify the columns to which the specified values are to be inserted.

Quando TOP viene utilizzato con INSERT, le righe a cui viene fatto riferimento non vengono disposte in alcun ordine e non è possibile specificare la clausola ORDER BY direttamente in tali istruzioni.When TOP is used with INSERT the referenced rows are not arranged in any order and the ORDER BY clause can not be directly specified in this statements. Se è necessario utilizzare TOP per inserire righe in un ordine cronologico significativo, è necessario utilizzare questa clausola insieme a una clausola ORDER BY specificata in un'istruzione sub-SELECT.If you need to use TOP to insert rows in a meaningful chronological order, you must use TOP together with an ORDER BY clause that is specified in a subselect statement. Vedere la sezione Esempi più avanti in questo argomento.See the Examples section that follows in this topic.

Le query INSERT che usano SELECT con ORDER BY per popolare le righe garantiscono la modalità di calcolo dei valori Identity, ma non l'ordine in cui vengono inserite le righe.INSERT queries that use SELECT with ORDER BY to populate rows guarantees how identity values are computed but not the order in which the rows are inserted.

In Parallel Data Warehouse la clausola ORDER BY non è valida in VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, nelle funzioni inline, nelle tabelle derivate, nelle sottoquery e nelle espressioni di tabella comuni a meno che non sia specificata anche la clausola TOP.In Parallel Data Warehouse, the ORDER BY clause is invalid in VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, inline functions, derived tables, subqueries and common table expressions, unless TOP is also specified.

Comportamento di registrazioneLogging Behavior

L'istruzione INSERT è sempre completamente registrata tranne quando si usa la funzione OPENROWSET con la parola chiave BULK o quando si usa l'istruzione INSERT INTO <target_table> SELECT <columns> FROM <source_table>.The INSERT statement is always fully logged except when using the OPENROWSET function with the BULK keyword or when using INSERT INTO <target_table> SELECT <columns> FROM <source_table>. Per queste operazioni è possibile eseguire la registrazione minima.These operations can be minimally logged. Per ulteriori informazioni, vedere la sezione "Procedure consigliate per il caricamento bulk dei dati" più indietro in questo argomento.For more information, see the section "Best Practices for Bulk Loading Data" earlier in this topic.

SecuritySecurity

Durante una connessione a un server collegato, il server mittente fornisce un nome di account di accesso e una password per connettersi al server ricevente per suo conto.During a linked server connection, the sending server provides a login name and password to connect to the receiving server on its behalf. Perché la connessione funzioni, è necessario creare un mapping dell'account di accesso tra i server collegati usando sp_addlinkedsrvlogin.For this connection to work, you must create a login mapping between the linked servers by using sp_addlinkedsrvlogin.

Quando si usa OPENROWSET(BULK...), è essenziale comprendere il modo in cui la rappresentazione viene gestita da SQL ServerSQL Server.When you use OPENROWSET(BULK...), it is important to understand how SQL ServerSQL Server handles impersonation. Per altre informazioni, vedere "Considerazioni sulla sicurezza" Importazione di dati per operazioni bulk con BULK INSERT o OPENROWSET(BULK...) (SQL Server).For more information, see "Security Considerations" in Import Bulk Data by Using BULK INSERT or OPENROWSET(BULK...) (SQL Server).

AutorizzazioniPermissions

È richiesta l'autorizzazione INSERT per la tabella di destinazione.INSERT permission is required on the target table.

Le autorizzazioni INSERT vengono assegnate per impostazione predefinita ai membri del ruolo predefinito del server sysadmin e ai membri dei ruoli predefiniti del database db_owner e db_datawriter nonché al proprietario della tabella.INSERT permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. I membri dei ruoli sysadmin, db_owner e db_securityadmin e il proprietario della tabella possono trasferire le autorizzazioni ad altri utenti.Members of the sysadmin, db_owner, and the db_securityadmin roles, and the table owner can transfer permissions to other users.

Per eseguire INSERT con l'opzione BULK della funzione OPENROWSET, è necessario essere un membro del ruolo predefinito del server sysadmin o bulkadmin.To execute INSERT with the OPENROWSET function BULK option, you must be a member of the sysadmin fixed server role or of the bulkadmin fixed server role.

EsempiExamples

CategoryCategory Elementi di sintassi inclusiFeatured syntax elements
Sintassi di baseBasic syntax INSERT • costruttore di valori di tabellaINSERT • table value constructor
Gestione dei valori di colonnaHandling column values IDENTITY • NEWID • valori predefiniti • tipi definiti dall'utenteIDENTITY • NEWID • default values • user-defined types
Inserimento di dati da altre tabelleInserting data from other tables INSERT...SELECT • INSERT...EXECUTE • espressione di tabella comune WITH • TOP • OFFSET FETCHINSERT...SELECT • INSERT...EXECUTE • WITH common table expression • TOP • OFFSET FETCH
Indicazione di oggetti di destinazione diversi dalle tabelle standardSpecifying target objects other than standard tables Viste • variabili di tabellaViews • table variables
Inserimento di righe in una tabella remotaInserting rows into a remote table Server collegato • funzione per set di righe OPENQUERY • funzione per set di righe OPENDATASOURCELinked server • OPENQUERY rowset function • OPENDATASOURCE rowset function
Caricamento bulk di dati da tabelle o file di datiBulk loading data from tables or data files INSERT...SELECT • funzione OPENROWSETINSERT...SELECT • OPENROWSET function
Override del comportamento predefinito di Query Optimizer tramite hintOverriding the default behavior of the query optimizer by using hints Hint di tabellaTable hints
Acquisizione dei risultati dell'istruzione INSERTCapturing the results of the INSERT statement Clausola OUTPUTOUTPUT clause

Sintassi di baseBasic Syntax

Negli esempi contenuti in questa sezione vengono illustrate le funzionalità di base dell'istruzione INSERT tramite la sintassi minima richiesta.Examples in this section demonstrate the basic functionality of the INSERT statement using the minimum required syntax.

A.A. Inserimento di una sola riga di datiInserting a single row of data

Nell'esempio seguente viene inserita una riga nella tabella Production.UnitMeasure del database AdventureWorks2012AdventureWorks2012.The following example inserts one row into the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database. Le colonne nella tabella sono UnitMeasureCode, Name e ModifiedDate.The columns in this table are UnitMeasureCode, Name, and ModifiedDate. Poiché vengono specificati valori per tutte le colonne e questi vengono elencati nello stesso ordine delle colonne nella tabella, non è necessario specificare i nomi delle colonne nell'elenco delle colonne .Because values for all columns are supplied and are listed in the same order as the columns in the table, the column names do not have to be specified in the column list .

INSERT INTO Production.UnitMeasure  
VALUES (N'FT', N'Feet', '20080414');  

B.B. Inserimento di più righe di datiInserting multiple rows of data

Nell'esempio seguente viene usato il costruttore di valori di tabella per inserire tre righe nella tabella Production.UnitMeasure del database AdventureWorks2012AdventureWorks2012 in una singola istruzione INSERT.The following example uses the table value constructor to insert three rows into the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database in a single INSERT statement. Poiché i valori per tutte le colonne vengono specificati ed elencati nello stesso ordine delle colonne nella tabella, non è necessario specificare i nomi delle colonne nell'elenco delle colonne.Because values for all columns are supplied and are listed in the same order as the columns in the table, the column names do not have to be specified in the column list.

INSERT INTO Production.UnitMeasure  
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923')
    , (N'Y3', N'Cubic Yards', '20080923');  

C.C. Inserimento di dati in un ordine diverso rispetto alle colonne della tabellaInserting data that is not in the same order as the table columns

Nell'esempio seguente viene utilizzato un elenco di colonne per specificare in modo esplicito i valori inseriti in ogni colonna.The following example uses a column list to explicitly specify the values that are inserted into each column. L'ordine delle colonne nella tabella Production.UnitMeasure nel database AdventureWorks2012AdventureWorks2012 è UnitMeasureCode, Name, ModifiedDate. Le colonne, tuttavia, non sono elencate in questo ordine in column_list.The column order in the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database is UnitMeasureCode, Name, ModifiedDate; however, the columns are not listed in that order in column_list.

INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,  
    ModifiedDate)  
VALUES (N'Square Yards', N'Y2', GETDATE());  

Gestione dei valori di colonnaHandling Column Values

Negli esempi contenuti in questa sezione vengono illustrati i metodi di inserimento dei valori nelle colonne definite con una proprietà IDENTITY, un valore DEFAULT oppure definite con tipi di dati quali uniqueidentifer o colonne di tipo definito dall'utente.Examples in this section demonstrate methods of inserting values into columns that are defined with an IDENTITY property, DEFAULT value, or are defined with data types such as uniqueidentifer or user-defined type columns.

D.D. Inserimento di dati in una tabella con colonne che presentano valori predefinitiInserting data into a table with columns that have default values

Nell'esempio seguente viene illustrato l'inserimento di righe in una tabella con colonne per cui viene generato automaticamente un valore o è specificato un valore predefinito.The following example shows inserting rows into a table with columns that automatically generate a value or have a default value. Column_1 è una colonna calcolata che genera automaticamente un valore concatenando una stringa con il valore inserito in column_2.Column_1 is a computed column that automatically generates a value by concatenating a string with the value inserted into column_2. Column_2 è definito con un vincolo predefinito.Column_2 is defined with a default constraint. Se per questa colonna non viene specificato alcun valore, viene utilizzato quello predefinito.If a value is not specified for this column, the default value is used. Column_3 è definito con il tipo di dati rowversion, che genera automaticamente un numero binario incrementale univoco.Column_3 is defined with the rowversion data type, which automatically generates a unique, incrementing binary number. Column_4 non genera automaticamente alcun valore.Column_4 does not automatically generate a value. Quando non viene specificato alcun valore per questa colonna, viene inserito un valore NULL.When a value for this column is not specified, NULL is inserted. Le istruzioni INSERT inseriscono righe che contengono valori solo per alcune delle colonne.The INSERT statements insert rows that contain values for some of the columns but not all. Nell'ultima istruzione INSERT non viene specificata alcuna colonna e solo i valori predefiniti vengono inseriti tramite la clausola DEFAULT VALUES.In the last INSERT statement, no columns are specified and only the default values are inserted by using the DEFAULT VALUES clause.

CREATE TABLE dbo.T1   
(  
    column_1 AS 'Computed column ' + column_2,   
    column_2 varchar(30)   
        CONSTRAINT default_name DEFAULT ('my column default'),  
    column_3 rowversion,  
    column_4 varchar(40) NULL  
);  
GO  
INSERT INTO dbo.T1 (column_4)   
    VALUES ('Explicit value');  
INSERT INTO dbo.T1 (column_2, column_4)   
    VALUES ('Explicit value', 'Explicit value');  
INSERT INTO dbo.T1 (column_2)   
    VALUES ('Explicit value');  
INSERT INTO T1 DEFAULT VALUES;   
GO  
SELECT column_1, column_2, column_3, column_4  
FROM dbo.T1;  
GO  

E.E. Inserimento di dati in una tabella con una colonna IdentityInserting data into a table with an identity column

Nell'esempio seguente vengono illustrati diversi metodi per l'inserimento di dati in una colonna Identity.The following example shows different methods of inserting data into an identity column. Le prime due istruzioni INSERT consentono di generare valori Identity per le nuove righe.The first two INSERT statements allow identity values to be generated for the new rows. La terza istruzione INSERT ignora la proprietà IDENTITY per la colonna con l'istruzione SET IDENTITY_INSERT e inserisce un valore esplicito nella colonna Identity.The third INSERT statement overrides the IDENTITY property for the column with the SET IDENTITY_INSERT statement and inserts an explicit value into the identity column.

CREATE TABLE dbo.T1 ( column_1 int IDENTITY, column_2 VARCHAR(30));  
GO  
INSERT T1 VALUES ('Row #1');  
INSERT T1 (column_2) VALUES ('Row #2');  
GO  
SET IDENTITY_INSERT T1 ON;  
GO  
INSERT INTO T1 (column_1,column_2)   
    VALUES (-99, 'Explicit identity value');  
GO  
SELECT column_1, column_2  
FROM T1;  
GO  

F.F. Inserimento di dati in una colonna uniqueidentifier tramite NEWID()Inserting data into a uniqueidentifier column by using NEWID()

L'esempio seguente usata la funzione NEWID() per ottenere un GUID per column_2.The following example uses the NEWID() function to obtain a GUID for column_2. Diversamente dalle colonne Identity, il Motore di databaseDatabase Engine non genera automaticamente valori per le colonne di tipo uniqueidentifier, come illustrato dalla seconda istruzione INSERT.Unlike for identity columns, the Motore di databaseDatabase Engine does not automatically generate values for columns with the uniqueidentifier data type, as shown by the second INSERT statement.

CREATE TABLE dbo.T1   
(  
    column_1 int IDENTITY,   
    column_2 uniqueidentifier,  
);  
GO  
INSERT INTO dbo.T1 (column_2)   
    VALUES (NEWID());  
INSERT INTO T1 DEFAULT VALUES;   
GO  
SELECT column_1, column_2  
FROM dbo.T1;  
  

G.G. Inserimento di dati in colonne di tipo definito dall'utenteInserting data into user-defined type columns

Le istruzioni Transact-SQLTransact-SQL seguenti consentono di inserire tre righe nella colonna PointValue della tabella Points.The following Transact-SQLTransact-SQL statements insert three rows into the PointValue column of the Points table. Questa colonna usa un tipo CLR definito dall'utente (UDT).This column uses a CLR user-defined type (UDT). Il tipo di dati Point è costituito da valori integer X e Y esposti come proprietà del tipo definito dall'utente.The Point data type consists of X and Y integer values that are exposed as properties of the UDT. È necessario utilizzare la funzione CAST o CONVERT per eseguire il cast dei valori X e Y delimitati da virgole al tipo Point.You must use either the CAST or CONVERT function to cast the comma-delimited X and Y values to the Point type. Le prime due istruzioni usano la funzione CONVERT per convertire un valore stringa nel tipo Point, mentre la terza istruzione usa la funzione CAST.The first two statements use the CONVERT function to convert a string value to the Point type, and the third statement uses the CAST function. Per altre informazioni, vedere Modifica di dati di tipo definito dall'utente.For more information, see Manipulating UDT Data.

INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '3,4'));  
INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '1,5'));  
INSERT INTO dbo.Points (PointValue) VALUES (CAST ('1,99' AS Point));  

Inserimento di dati da altre tabelleInserting Data from Other Tables

Negli esempi contenuti in questa sezione vengono illustrati i metodi per l'inserimento di righe da una tabella in un'altra.Examples in this section demonstrate methods of inserting rows from one table into another table.

H.H. Utilizzo delle opzioni SELECT ed EXECUTE per inserire dati da altre tabelleUsing the SELECT and EXECUTE options to insert data from other tables

Nell'esempio seguente viene illustrato come inserire dati da una tabella in un'altra usando l'istruzione INSERT...SELECT o INSERT...EXECUTE.The following example shows how to insert data from one table into another table by using INSERT...SELECT or INSERT...EXECUTE. Ogni metodo è basato su un'istruzione SELECT su più tabelle, in cui l'elenco di colonne include un'espressione e un valore letterale.Each is based on a multi-table SELECT statement that includes an expression and a literal value in the column list.

La prima istruzione INSERT usa un'istruzione SELECT per derivare i dati dalle tabelle di origine (Employee, SalesPerson e Person) nel database AdventureWorks2012AdventureWorks2012 e archiviare il set di risultati nella tabella EmployeeSales.The first INSERT statement uses a SELECT statement to derive the data from the source tables (Employee, SalesPerson, and Person) in the AdventureWorks2012AdventureWorks2012 database and store the result set in the EmployeeSales table. Nella seconda istruzione INSERT viene utilizzata la clausola EXECUTE per chiamare una stored procedure che contiene l'istruzione SELECT. Nella terza istruzione INSERT viene utilizzata la clausola EXECUTE per fare riferimento all'istruzione SELECT come stringa letterale.The second INSERT statement uses the EXECUTE clause to call a stored procedure that contains the SELECT statement, and the third INSERT uses the EXECUTE clause to reference the SELECT statement as a literal string.

CREATE TABLE dbo.EmployeeSales  
( DataSource   varchar(20) NOT NULL,  
  BusinessEntityID   varchar(11) NOT NULL,  
  LastName     varchar(40) NOT NULL,  
  SalesDollars money NOT NULL  
);  
GO  
CREATE PROCEDURE dbo.uspGetEmployeeSales   
AS   
    SET NOCOUNT ON;  
    SELECT 'PROCEDURE', sp.BusinessEntityID, c.LastName,   
        sp.SalesYTD   
    FROM Sales.SalesPerson AS sp    
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.BusinessEntityID LIKE '2%'  
    ORDER BY sp.BusinessEntityID, c.LastName;  
GO  
--INSERT...SELECT example  
INSERT INTO dbo.EmployeeSales  
    SELECT 'SELECT', sp.BusinessEntityID, c.LastName, sp.SalesYTD   
    FROM Sales.SalesPerson AS sp  
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.BusinessEntityID LIKE '2%'  
    ORDER BY sp.BusinessEntityID, c.LastName;  
GO  
--INSERT...EXECUTE procedure example  
INSERT INTO dbo.EmployeeSales   
EXECUTE dbo.uspGetEmployeeSales;  
GO  
--INSERT...EXECUTE('string') example  
INSERT INTO dbo.EmployeeSales   
EXECUTE   
('  
SELECT ''EXEC STRING'', sp.BusinessEntityID, c.LastName,   
    sp.SalesYTD   
    FROM Sales.SalesPerson AS sp   
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.BusinessEntityID LIKE ''2%''  
    ORDER BY sp.BusinessEntityID, c.LastName  
');  
GO  
--Show results.  
SELECT DataSource,BusinessEntityID,LastName,SalesDollars  
FROM dbo.EmployeeSales;  

I.I. Utilizzo dell'espressione di tabella comune WITH per la definizione dei dati inseritiUsing WITH common table expression to define the data inserted

Nell'esempio seguente viene creata la tabella NewEmployee nel database AdventureWorks2012AdventureWorks2012.The following example creates the NewEmployee table in the AdventureWorks2012AdventureWorks2012 database. Le righe di una o più tabelle da inserire nella tabella EmployeeTemp vengono definite tramite un'espressione di tabella comune (NewEmployee).A common table expression (EmployeeTemp) defines the rows from one or more tables to be inserted into the NewEmployee table. L'istruzione INSERT fa riferimento alle colonne nell'espressione di tabella comune.The INSERT statement references the columns in the common table expression.

CREATE TABLE HumanResources.NewEmployee  
(  
    EmployeeID int NOT NULL,  
    LastName nvarchar(50) NOT NULL,  
    FirstName nvarchar(50) NOT NULL,  
    PhoneNumber Phone NULL,  
    AddressLine1 nvarchar(60) NOT NULL,  
    City nvarchar(30) NOT NULL,  
    State nchar(3) NOT NULL,   
    PostalCode nvarchar(15) NOT NULL,  
    CurrentFlag Flag  
);  
GO  
WITH EmployeeTemp (EmpID, LastName, FirstName, Phone,   
                   Address, City, StateProvince,   
                   PostalCode, CurrentFlag)  
AS (SELECT   
       e.BusinessEntityID, c.LastName, c.FirstName, pp.PhoneNumber,  
       a.AddressLine1, a.City, sp.StateProvinceCode,   
       a.PostalCode, e.CurrentFlag  
    FROM HumanResources.Employee e  
        INNER JOIN Person.BusinessEntityAddress AS bea  
        ON e.BusinessEntityID = bea.BusinessEntityID  
        INNER JOIN Person.Address AS a  
        ON bea.AddressID = a.AddressID  
        INNER JOIN Person.PersonPhone AS pp  
        ON e.BusinessEntityID = pp.BusinessEntityID  
        INNER JOIN Person.StateProvince AS sp  
        ON a.StateProvinceID = sp.StateProvinceID  
        INNER JOIN Person.Person as c  
        ON e.BusinessEntityID = c.BusinessEntityID  
    )  
INSERT INTO HumanResources.NewEmployee   
    SELECT EmpID, LastName, FirstName, Phone,   
           Address, City, StateProvince, PostalCode, CurrentFlag  
    FROM EmployeeTemp;  
GO  

J.J. Utilizzo della clausola TOP per limitare i dati inseriti dalla tabella di origineUsing TOP to limit the data inserted from the source table

Nell'esempio seguente viene creata la tabella EmployeeSales e vengono inseriti il nome e i dati di vendita da inizio anno per i primi 5 dipendenti casuali presenti nella tabella HumanResources.Employee del database AdventureWorks2012AdventureWorks2012.The following example creates the table EmployeeSales and inserts the name and year-to-date sales data for the top 5 random employees from the table HumanResources.Employee in the AdventureWorks2012AdventureWorks2012 database. L'istruzione INSERT sceglie 5 righe qualsiasi tra quelle restituite dall'istruzione SELECT.The INSERT statement chooses any 5 rows returned by the SELECT statement. La clausola OUTPUT consente di visualizzare le righe inserite nella tabella EmployeeSales.The OUTPUT clause displays the rows that are inserted into the EmployeeSales table. Si noti che la clausola ORDER BY nell'istruzione SELECT non viene utilizzata per determinare i primi 5 dipendenti.Notice that the ORDER BY clause in the SELECT statement is not used to determine the top 5 employees.

CREATE TABLE dbo.EmployeeSales  
( EmployeeID   nvarchar(11) NOT NULL,  
  LastName     nvarchar(20) NOT NULL,  
  FirstName    nvarchar(20) NOT NULL,  
  YearlySales  money NOT NULL  
 );  
GO  
INSERT TOP(5)INTO dbo.EmployeeSales  
    OUTPUT inserted.EmployeeID, inserted.FirstName, 
        inserted.LastName, inserted.YearlySales  
    SELECT sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD   
    FROM Sales.SalesPerson AS sp  
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.SalesYTD > 250000.00  
    ORDER BY sp.SalesYTD DESC;  

Se è necessario utilizzare TOP per inserire righe in un ordine cronologico significativo, è necessario utilizzare questa clausola insieme a ORDER BY in un'istruzione sub-SELECT, come illustrato nell'esempio seguente.If you have to use TOP to insert rows in a meaningful chronological order, you must use TOP together with ORDER BY in a subselect statement as shown in the following example. La clausola OUTPUT consente di visualizzare le righe inserite nella tabella EmployeeSales.The OUTPUT clause displays the rows that are inserted into the EmployeeSales table. Si noti che i primi 5 dipendenti vengono ora inseriti in base ai risultati della clausola ORDER BY anziché alle righe casuali.Notice that the top 5 employees are now inserted based on the results of the ORDER BY clause instead of random rows.

INSERT INTO dbo.EmployeeSales  
    OUTPUT inserted.EmployeeID, inserted.FirstName, 
        inserted.LastName, inserted.YearlySales  
    SELECT TOP (5) sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD   
    FROM Sales.SalesPerson AS sp  
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.SalesYTD > 250000.00  
    ORDER BY sp.SalesYTD DESC;  

Indicazione di oggetti di destinazione diversi dalle tabelle standardSpecifying Target Objects Other Than Standard Tables

Negli esempi contenuti in questa sezione viene illustrato come inserire righe specificando una vista o una variabile di tabella.Examples in this section demonstrate how to insert rows by specifying a view or table variable.

K.K. Inserimento di dati specificando una vistaInserting data by specifying a view

Nell'esempio seguente viene specificato il nome di una vista come oggetto di destinazione. La nuova riga, tuttavia, viene inserita nella tabella di base sottostante.The following example specifies a view name as the target object; however, the new row is inserted in the underlying base table. L'ordine dei valori nell'istruzione INSERT deve corrispondere all'ordine delle colonne della vista.The order of the values in the INSERT statement must match the column order of the view. Per altre informazioni, vedere Modificare i dati tramite una vista.For more information, see Modify Data Through a View.

CREATE TABLE T1 ( column_1 int, column_2 varchar(30));  
GO  
CREATE VIEW V1 AS   
SELECT column_2, column_1   
FROM T1;  
GO  
INSERT INTO V1   
    VALUES ('Row 1',1);  
GO  
SELECT column_1, column_2   
FROM T1;  
GO  
SELECT column_1, column_2  
FROM V1;  
GO  

L.L. Inserimento di dati in una variabile di tabellaInserting data into a table variable

Nell'esempio seguente viene specificata una variabile di tabella come oggetto di destinazione nel database AdventureWorks2012AdventureWorks2012.The following example specifies a table variable as the target object in the AdventureWorks2012AdventureWorks2012 database.

-- Create the table variable.  
DECLARE @MyTableVar table(  
    LocationID int NOT NULL,  
    CostRate smallmoney NOT NULL,  
    NewCostRate AS CostRate * 1.5,  
    ModifiedDate datetime);  
  
-- Insert values into the table variable.  
INSERT INTO @MyTableVar (LocationID, CostRate, ModifiedDate)  
    SELECT LocationID, CostRate, GETDATE() 
    FROM Production.Location  
    WHERE CostRate > 0;  
  
-- View the table variable result set.  
SELECT * FROM @MyTableVar;  
GO  

Inserimento di righe in una tabella remotaInserting Rows into a Remote Table

Gli esempi di questa sezione illustrano come inserire righe in una tabella di destinazione remota tramite un server collegato o una funzione per i set di righe per fare riferimento alla tabella remota.Examples in this section demonstrate how to insert rows into a remote target table by using a linked server or a rowset function to reference the remote table.

M.M. Inserimento di dati in una tabella remota tramite un server collegatoInserting data into a remote table by using a linked server

Nell'esempio seguente vengono inserite righe in una tabella remota.The following example inserts rows into a remote table. L'esempio inizia con la creazione di un collegamento all'origine dati remota tramite sp_addlinkedserver.The example begins by creating a link to the remote data source by using sp_addlinkedserver. Il nome del server collegato, MyLinkServer, viene specificato come parte del nome di oggetto in quattro parti nel formato server.catalogo.schema.oggetto.The linked server name, MyLinkServer, is then specified as part of the four-part object name in the form server.catalog.schema.object.

Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

USE master;  
GO  
-- Create a link to the remote data source.   
-- Specify a valid server name for @datasrc as 'server_name' 
-- or 'server_nameinstance_name'.  
  
EXEC sp_addlinkedserver @server = N'MyLinkServer',  
    @srvproduct = N' ',  
    @provider = N'SQLNCLI',   
    @datasrc = N'server_name',  
    @catalog = N'AdventureWorks2012';  
GO  
-- Specify the remote data source in the FROM clause using a four-part name   
-- in the form linked_server.catalog.schema.object.  
  
INSERT INTO MyLinkServer.AdventureWorks2012.HumanResources.Department (Name, GroupName)  
VALUES (N'Public Relations', N'Executive General and Administration');  
GO  

N.N. Inserimento di dati in una tabella remota tramite una funzione OPENQUERYInserting data into a remote table by using the OPENQUERY function

L'esempio seguente inserisce una riga in una tabella remota specificando la funzione per i set di righe OPENQUERY.The following example inserts a row into a remote table by specifying the OPENQUERY rowset function. Viene utilizzato il nome del server collegato creato nell'esempio precedente.The linked server name created in the previous example is used in this example.

Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

INSERT OPENQUERY (MyLinkServer, 
    'SELECT Name, GroupName 
     FROM AdventureWorks2012.HumanResources.Department')  
VALUES ('Environmental Impact', 'Engineering');  
GO  

O.O. Inserimento di dati in una tabella remota tramite una funzione OPENDATASOURCEInserting data into a remote table by using the OPENDATASOURCE function

L'esempio seguente inserisce una riga in una tabella remota tramite la funzione per i set di righe OPENDATASOURCE.The following example inserts a row into a remote table by specifying the OPENDATASOURCE rowset function. Specificare un nome server valido per l'origine dati usando il formato nome_server oppure nome_server\nome_istanza.Specify a valid server name for the data source by using the format server_name or server_name\instance_name.

Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

-- Use the OPENDATASOURCE function to specify the remote data source.  
-- Specify a valid server name for Data Source using the format 
-- server_name or server_nameinstance_name.  
  
INSERT INTO OPENDATASOURCE('SQLNCLI',  
    'Data Source= <server_name>; Integrated Security=SSPI')  
    .AdventureWorks2012.HumanResources.Department (Name, GroupName)  
    VALUES (N'Standards and Methods', 'Quality Assurance');  
GO  

P.P. Inserimento in una tabella esterna creata con PolyBaseInserting into an external table created using PolyBase

Esportare dati da SQL Server in Hadoop o Archiviazione di Azure.Export data from SQL Server to Hadoop or Azure Storage. Prima di tutto creare una tabella esterna che punta al file o alla directory di destinazione.First, create an external table that points to the destination file or directory. Usare quindi INSERT INTO per esportare i dati da una tabella di SQL Server locale a un'origine dati esterna.Then, use INSERT INTO to export data from a local SQL Server table to an external data source. L'istruzione INSERT INTO crea il file o la directory di destinazione, se non esiste, e i risultati dell'istruzione SELECT vengono esportati nel percorso specificato nel formato di file specificato.The INSERT INTO statement creates the destination file or directory if it does not exist and the results of the SELECT statement are exported to the specified location in the specified file format. Per altre informazioni, vedere Get started with PolyBase(Introduzione a PolyBase).For more information, see Get started with PolyBase.

Si applica a: SQL Server 2017SQL Server 2017.Applies to: SQL Server 2017SQL Server 2017.

-- Create an external table.   
CREATE EXTERNAL TABLE [dbo].[FastCustomers2009] (  
        [FirstName] char(25) NOT NULL,   
        [LastName] char(25) NOT NULL,   
        [YearlyIncome] float NULL,   
        [MaritalStatus] char(1) NOT NULL  
)  
WITH (  
        LOCATION='/old_data/2009/customerdata.tbl',  
        DATA_SOURCE = HadoopHDP2,  
        FILE_FORMAT = TextFileFormat,  
        REJECT_TYPE = VALUE,  
        REJECT_VALUE = 0  
);  
  
-- Export data: Move old data to Hadoop while keeping 
-- it query-able via external table.  

INSERT INTO dbo.FastCustomer2009  
SELECT T.* FROM Insured_Customers T1 JOIN CarSensor_Data T2  
ON (T1.CustomerKey = T2.CustomerKey)  
WHERE T2.YearMeasured = 2009 and T2.Speed > 40;  

Caricamento bulk di dati da tabelle o file di datiBulk Loading Data from Tables or Data Files

Negli esempi di questa sezione vengono illustrati due metodi per eseguire il caricamento bulk dei dati in una tabella tramite l'istruzione INSERT.Examples in this section demonstrate two methods to bulk load data into a table by using the INSERT statement.

Q.Q. Inserimento di dati in un heap con registrazione minimaInserting data into a heap with minimal logging

Nell'esempio seguente viene creata una nuova tabella (heap) in cui vengono inseriti dati da un'altra tabella con registrazione minima.The following example creates a new table (a heap) and inserts data from another table into it using minimal logging. L'esempio presuppone che il modello di recupero del database AdventureWorks2012 sia impostato su FULL.The example assumes that the recovery model of the AdventureWorks2012 database is set to FULL. Per assicurare l'uso della registrazione minima, il modello di recupero del database AdventureWorks2012 viene impostato su BULK_LOGGED prima che le righe vengano inserite e reimpostato su FULL dopo l'istruzione INSERT INTO...SELECT.To ensure minimal logging is used, the recovery model of the AdventureWorks2012 database is set to BULK_LOGGED before rows are inserted and reset to FULL after the INSERT INTO...SELECT statement. Inoltre, viene specificato l'hint TABLOCK per la tabella di destinazione Sales.SalesHistory.In addition, the TABLOCK hint is specified for the target table Sales.SalesHistory. In tal modo, si assicura l'utilizzo da parte dell'istruzione di uno spazio minimo nel log delle transazioni con risultati efficienti.This ensures that the statement uses minimal space in the transaction log and performs efficiently.

-- Create the target heap.  
CREATE TABLE Sales.SalesHistory(  
    SalesOrderID int NOT NULL,  
    SalesOrderDetailID int NOT NULL,  
    CarrierTrackingNumber nvarchar(25) NULL,  
    OrderQty smallint NOT NULL,  
    ProductID int NOT NULL,  
    SpecialOfferID int NOT NULL,  
    UnitPrice money NOT NULL,  
    UnitPriceDiscount money NOT NULL,  
    LineTotal money NOT NULL,  
    rowguid uniqueidentifier ROWGUIDCOL  NOT NULL,  
    ModifiedDate datetime NOT NULL );  
GO  
-- Temporarily set the recovery model to BULK_LOGGED.  
ALTER DATABASE AdventureWorks2012  
SET RECOVERY BULK_LOGGED;  
GO  
-- Transfer data from Sales.SalesOrderDetail to Sales.SalesHistory  
INSERT INTO Sales.SalesHistory WITH (TABLOCK)  
    (SalesOrderID,   
     SalesOrderDetailID,  
     CarrierTrackingNumber,   
     OrderQty,   
     ProductID,   
     SpecialOfferID,   
     UnitPrice,   
     UnitPriceDiscount,  
     LineTotal,   
     rowguid,   
     ModifiedDate)  
SELECT * FROM Sales.SalesOrderDetail;  
GO  
-- Reset the recovery model.  
ALTER DATABASE AdventureWorks2012  
SET RECOVERY FULL;  
GO  

R.R. Utilizzo della funzione OPENROWSET con BULK per eseguire il caricamento bulk dei dati in una tabellaUsing the OPENROWSET function with BULK to bulk load data into a table

Nell'esempio seguente vengono inserite righe da un file di dati in una tabella specificando la funzione OPENROWSET.The following example inserts rows from a data file into a table by specifying the OPENROWSET function. Per l'ottimizzazione delle prestazioni, viene specificato l'hint di tabella IGNORE_TRIGGERS.The IGNORE_TRIGGERS table hint is specified for performance optimization. Per altri esempi, vedere Importazione di dati per operazioni bulk con BULK INSERT o OPENROWSET(BULK...) (SQL Server).For more examples, see Import Bulk Data by Using BULK INSERT or OPENROWSET(BULK...) (SQL Server).

Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

INSERT INTO HumanResources.Department WITH (IGNORE_TRIGGERS) (Name, GroupName)  
SELECT b.Name, b.GroupName   
FROM OPENROWSET (  
    BULK 'C:SQLFilesDepartmentData.txt',  
    FORMATFILE = 'C:SQLFilesBulkloadFormatFile.xml',  
    ROWS_PER_BATCH = 15000)AS b ;  

Override del comportamento predefinito di Query Optimizer tramite hintOverriding the Default Behavior of the Query Optimizer by Using Hints

Gli esempi contenuti in questa sezione illustrano come usare gli hint di tabella per eseguire temporaneamente l'override del comportamento predefinito di Query Optimizer durante l'elaborazione dell'istruzione INSERT.Examples in this section demonstrate how to use table hints to temporarily override the default behavior of the query optimizer when processing the INSERT statement.

Attenzione

Poiché Query Optimizer di SQL ServerSQL Server consente in genere di selezionare il piano di esecuzione migliore per una query, gli hint devono essere usati solo se strettamente necessari ed esclusivamente da sviluppatori e amministratori di database esperti.Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend that hints be used only as a last resort by experienced developers and database administrators.

S.S. Utilizzo dell'hint TABLOCK per specificare un metodo di bloccoUsing the TABLOCK hint to specify a locking method

Nell'esempio seguente viene impostata l'acquisizione di un blocco esclusivo (X) sulla tabella Production.Location. Tale blocco viene mantenuto attivo fino al termine dell'istruzione INSERT.The following example specifies that an exclusive (X) lock is taken on the Production.Location table and is held until the end of the INSERT statement.

Si applica a: SQL ServerSQL Server, Database SQLSQL Database.Applies to: SQL ServerSQL Server, Database SQLSQL Database.

INSERT INTO Production.Location WITH (XLOCK)  
(Name, CostRate, Availability)  
VALUES ( N'Final Inventory', 15.00, 80.00);  

Acquisizione dei risultati dell'istruzione INSERTCapturing the Results of the INSERT Statement

Gli esempi contenuti in questa sezione illustrano come usare la clausola OUTPUT per restituire informazioni da (o espressioni basate su) ogni riga interessata da un'istruzione INSERT.Examples in this section demonstrate how to use the OUTPUT Clause to return information from, or expressions based on, each row affected by an INSERT statement. Questi risultati possono essere restituiti all'applicazione di elaborazione per l'utilizzo nei messaggi di errore, l'archiviazione e altri scopi simili dell'applicazione.These results can be returned to the processing application for use in such things as confirmation messages, archiving, and other such application requirements.

T.T. Uso della clausola OUTPUT con un'istruzione INSERTUsing OUTPUT with an INSERT statement

Nell'esempio seguente viene inserita una riga nella tabella ScrapReason e viene utilizzata la clausola OUTPUT per restituire i risultati dell'istruzione alla variabile di tabella @MyTableVar.The following example inserts a row into the ScrapReason table and uses the OUTPUT clause to return the results of the statement to the @MyTableVar table variable. Poiché la colonna ScrapReasonID è definita con una proprietà IDENTITY, per tale colonna non viene specificato un valore nell'istruzione INSERT.Because the ScrapReasonID column is defined with an IDENTITY property, a value is not specified in the INSERT statement for that column. Si noti tuttavia che il valore generato dal Motore di databaseDatabase Engine per tale colonna viene restituito nella clausola OUTPUT nella colonna INSERTED.ScrapReasonID.However, note that the value generated by the Motore di databaseDatabase Engine for that column is returned in the OUTPUT clause in the INSERTED.ScrapReasonID column.

DECLARE @MyTableVar table( NewScrapReasonID smallint,  
                           Name varchar(50),  
                           ModifiedDate datetime);  
INSERT Production.ScrapReason  
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate  
        INTO @MyTableVar  
VALUES (N'Operator error', GETDATE());  
  
--Display the result set of the table variable.  
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;  
--Display the result set of the table.  
SELECT ScrapReasonID, Name, ModifiedDate   
FROM Production.ScrapReason;  

U.U. Utilizzo della clausola OUTPUT con colonne Identity e calcolateUsing OUTPUT with identity and computed columns

Nell'esempio seguente viene creata la tabella EmployeeSales in cui vengono quindi inserite diverse righe tramite un'istruzione INSERT con un'istruzione SELECT per il recupero dei dati dalle tabelle di origine.The following example creates the EmployeeSales table and then inserts several rows into it using an INSERT statement with a SELECT statement to retrieve data from source tables. La tabella EmployeeSales include una colonna Identity (EmployeeID) e una colonna calcolata (ProjectedSales).The EmployeeSales table contains an identity column (EmployeeID) and a computed column (ProjectedSales). Poiché questi valori vengono generati dal Motore di databaseDatabase Engine durante l'operazione di inserimento, nessuna di queste colonne può essere definita in @MyTableVar.Because these values are generated by the Motore di databaseDatabase Engine during the insert operation, neither of these columns can be defined in @MyTableVar.

CREATE TABLE dbo.EmployeeSales  
( EmployeeID   int IDENTITY (1,5)NOT NULL,  
  LastName     nvarchar(20) NOT NULL,  
  FirstName    nvarchar(20) NOT NULL,  
  CurrentSales money NOT NULL,  
  ProjectedSales AS CurrentSales * 1.10   
);  
GO  
DECLARE @MyTableVar table(  
  LastName     nvarchar(20) NOT NULL,  
  FirstName    nvarchar(20) NOT NULL,  
  CurrentSales money NOT NULL  
  );  
  
INSERT INTO dbo.EmployeeSales (LastName, FirstName, CurrentSales)  
  OUTPUT INSERTED.LastName,   
         INSERTED.FirstName,   
         INSERTED.CurrentSales  
  INTO @MyTableVar  
    SELECT c.LastName, c.FirstName, sp.SalesYTD  
    FROM Sales.SalesPerson AS sp  
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.BusinessEntityID LIKE '2%'  
    ORDER BY c.LastName, c.FirstName;  
  
SELECT LastName, FirstName, CurrentSales  
FROM @MyTableVar;  
GO  
SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales  
FROM dbo.EmployeeSales;  

V.V. Inserimento dei dati restituiti da una clausola OUTPUTInserting data returned from an OUTPUT clause

Nell'esempio seguente vengono acquisiti i dati restituiti dalla clausola OUTPUT di un'istruzione MERGE e tali dati vengono inseriti in un'altra tabella.The following example captures data returned from the OUTPUT clause of a MERGE statement, and inserts that data into another table. L'istruzione MERGE consente di aggiornare quotidianamente la colonna Quantity della tabella ProductInventory, in base agli ordini elaborati nella tabella SalesOrderDetail del database AdventureWorks2012AdventureWorks2012.The MERGE statement updates the Quantity column of the ProductInventory table daily, based on orders that are processed in the SalesOrderDetail table in the AdventureWorks2012AdventureWorks2012 database. Vengono inoltre eliminate le righe dei prodotti le cui scorte vengono azzerate.It also deletes rows for products whose inventories drop to 0. In questo esempio vengono acquisite le righe eliminate, che vengono inserite in un'altra tabella, ZeroInventory, in cui viene tenuta traccia dei prodotti senza scorte.The example captures the rows that are deleted and inserts them into another table, ZeroInventory, which tracks products with no inventory.

--Create ZeroInventory table.  
CREATE TABLE Production.ZeroInventory (DeletedProductID int, RemovedOnDate DateTime);  
GO  
  
INSERT INTO Production.ZeroInventory (DeletedProductID, RemovedOnDate)  
SELECT ProductID, GETDATE()  
FROM  
(   MERGE Production.ProductInventory AS pi  
    USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod  
           JOIN Sales.SalesOrderHeader AS soh  
           ON sod.SalesOrderID = soh.SalesOrderID  
           AND soh.OrderDate = '20070401'  
           GROUP BY ProductID) AS src (ProductID, OrderQty)  
    ON (pi.ProductID = src.ProductID)  
    WHEN MATCHED AND pi.Quantity - src.OrderQty <= 0  
        THEN DELETE  
    WHEN MATCHED  
        THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty  
    OUTPUT $action, deleted.ProductID) AS Changes (Action, ProductID)  
WHERE Action = 'DELETE';  
IF @@ROWCOUNT = 0  
PRINT 'Warning: No rows were inserted';  
GO  
SELECT DeletedProductID, RemovedOnDate FROM Production.ZeroInventory;  

W.W. Inserimento di dati tramite l'opzione SELECTInserting data using the SELECT option

L'esempio seguente illustra come inserire più righe di dati tramite un'istruzione INSERT con un'opzione SELECT.The following example shows how to insert multiple rows of data using an INSERT statement with a SELECT option. La prima istruzione INSERT usa direttamente un'istruzione SELECT per recuperare i dati dalla tabella di origine e quindi archiviare il set di risultati nella tabellaEmployeeTitles.The first INSERT statement uses a SELECT statement directly to retrieve data from the source table, and then to store the result set in the EmployeeTitles table.

CREATE TABLE EmployeeTitles  
( EmployeeKey   INT NOT NULL,  
  LastName     varchar(40) NOT NULL,  
  Title      varchar(50) NOT NULL  
);  
INSERT INTO EmployeeTitles  
    SELECT EmployeeKey, LastName, Title   
    FROM ssawPDW.dbo.DimEmployee  
    WHERE EndDate IS NULL;  

X.X. Indicazione di un'etichetta con l'istruzione INSERTSpecifying a label with the INSERT statement

L'esempio seguente illustra l'uso di un'etichetta con un'istruzione INSERT.The following example shows the use of a label with an INSERT statement.

-- Uses AdventureWorks  
  
INSERT INTO DimCurrency   
VALUES (500, N'C1', N'Currency1')  
OPTION ( LABEL = N'label1' );  

Y.Y. Uso di un'etichetta e di un hint per la query con l'istruzione INSERTUsing a label and a query hint with the INSERT statement

Questa query illustra la sintassi di base per l'uso di un'etichetta e di un hint di join per la query con l'istruzione INSERT.This query shows the basic syntax for using a label and a query join hint with the INSERT statement. Dopo l'invio della query al nodo di controllo, SQL ServerSQL Server, in esecuzione nei nodi di calcolo, genera il piano di query di SQL ServerSQL Server applicando la strategia di hash join.After the query is submitted to the Control node, SQL ServerSQL Server, running on the Compute nodes, will apply the hash join strategy when it generates the SQL ServerSQL Server query plan. Per altre informazioni sugli hint di join e su come usare la clausola OPTION, vedere OPTION (SQL Server PDW).For more information on join hints and how to use the OPTION clause, see OPTION (SQL Server PDW).

-- Uses AdventureWorks  
  
INSERT INTO DimCustomer (CustomerKey, CustomerAlternateKey, 
    FirstName, MiddleName, LastName )   
SELECT ProspectiveBuyerKey, ProspectAlternateKey, 
    FirstName, MiddleName, LastName  
FROM ProspectiveBuyer p JOIN DimGeography g ON p.PostalCode = g.PostalCode  
WHERE g.CountryRegionCode = 'FR'  
OPTION ( LABEL = 'Add French Prospects', HASH JOIN);  

Vedere ancheSee Also

BULK INSERT (Transact-SQL) BULK INSERT (Transact-SQL)
DELETE (Transact-SQL) DELETE (Transact-SQL)
EXECUTE (Transact-SQL) EXECUTE (Transact-SQL)
FROM (Transact-SQL) FROM (Transact-SQL)
IDENTITY (proprietà) (Transact-SQL) IDENTITY (Property) (Transact-SQL)
NEWID (Transact-SQL) NEWID (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
UPDATE (Transact-SQL) UPDATE (Transact-SQL)
MERGE (Transact-SQL) MERGE (Transact-SQL)
Clausola OUTPUT (Transact-SQL) OUTPUT Clause (Transact-SQL)
Usare le tabelle inserite ed eliminateUse the inserted and deleted Tables