INSERT (Transact-SQL)

Aggiunge una nuova riga a una tabella o vista.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

[ 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 ] ) 
    | derived_table 
    | execute_statement 
    } 
} 
    | DEFAULT VALUES 
[; ]

<object> ::=
{ 
    [ server_name . database_name . schema_name . 
      | database_name .[ schema_name ] . 
      | schema_name . 
    ]
        table_or_view_name
}

Argomenti

  • WITH <common_table_expression>
    Specifica il set di risultati denominato temporaneo, noto anche come espressione di tabella comune (CTE), definito nell'ambito dell'istruzione INSERT. Il set di risultati deriva da un'istruzione SELECT.

    Le espressioni di tabella comuni possono essere utilizzate anche con le istruzioni SELECT, DELETE, UPDATE e CREATE VIEW. Per ulteriori informazioni, vedere WITH common_table_expression (Transact-SQL).

  • TOP (expression) [ PERCENT ]
    Specifica il numero o la percentuale di righe casuali che verranno inserite. expression può essere un numero o una percentuale delle righe. Le righe a cui viene fatto riferimento nell'espressione TOP utilizzata con INSERT, UPDATE o DELETE non sono ordinate.

    Le parentesi per la delimitazione di expression nella clausola TOP sono obbligatorie per le istruzioni INSERT, UPDATE e DELETE. Per ulteriori informazioni, vedere TOP (Transact-SQL).

  • INTO
    Parola chiave facoltativa che può essere specificata tra INSERT e la tabella di destinazione.
  • server_name
    Nome del server (utilizzando la funzione OPENDATASOURCE come nome del server) in cui è disponibile la tabella o la vista. Se viene specificato server_name, sono necessari database_name e schema_name.
  • database_name
    Nome del database.
  • schema_name
    Nome dello schema a cui appartiene la tabella o la vista.
  • table_or view_name
    Nome della tabella o vista in cui si desidera inserire i dati.

    Una variabile table, all'interno del proprio ambito, può essere utilizzata come origine tabella in un'istruzione INSERT.

    È necessario che la vista specificata nell'argomento table_or_view_name sia aggiornabile e includa un riferimento a una sola tabella di base nella clausola FROM. Ad esempio, in un'istruzione INSERT eseguita in una vista a più tabelle è necessario specificare un argomento column_list che fa riferimento solo alle colonne di una tabella di base. Per ulteriori informazioni sulle viste aggiornabili, vedere CREATE VIEW (Transact-SQL).

  • WITH ( <table_hint_limited> [... n ] )
    Specifica uno o più hint di tabella consentiti per una tabella di destinazione. La parola chiave WITH e le parentesi sono obbligatorie.

    Le opzioni READPAST, NOLOCK e READUNCOMMITTED non sono consentite. Per ulteriori informazioni sugli hint di tabella, vedere table_hint (Transact-SQL).

    ms174335.note(it-it,SQL.90).gifImportante:
    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 Server. Questi hint non influiscono sulle prestazioni delle istruzioni INSERT. Evitarne l'utilizzo in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui sono attualmente implementati.

    L'impostazione di un hint TABLOCK su una tabella di destinazione di un'istruzione INSERT equivale a specificare l'hint TABLOCKX. Viene infatti acquisito un blocco esclusivo sulla tabella.

  • (column_list)
    Elenco di una o più colonne in cui inserire i dati. column_list deve essere racchiuso tra parentesi e delimitato da virgole.

    Se una colonna non è presente nell'elenco column_list, il Motore di database di SQL Server 2005 deve essere in grado di fornire un valore in base alla definizione della colonna. In caso contrario la riga non può essere caricata. Nel Motore di database viene fornito automaticamente un valore se la colonna:

    • Include la proprietà IDENTITY. Viene utilizzato il valore Identity incrementale successivo.
    • Include un valore predefinito. Viene utilizzato il valore predefinito della colonna.
    • È di tipo timestamp. Viene utilizzato il valore timestamp corrente.
    • Supporta valori Null. Viene utilizzato un valore Null.
    • È una colonna calcolata. Viene utilizzato il valore calcolato.

    Quando vengono inseriti valori espliciti in una colonna Identity, è necessario utilizzare gli elenchi column_list e VALUES. L'opzione SET IDENTITY_INSERT deve essere inoltre impostata su ON per la tabella.

  • Clausola OUTPUT
    Restituisce le righe inserite nell'ambito dell'operazione di inserimento. La clausola OUTPUT non è supportata in istruzioni DML che fanno riferimento a viste partizionate locali, viste partizionate distribuite o tabelle remote, oppure per istruzioni INSERT che contengono un parametro execute_statement.
  • VALUES
    Parola chiave che introduce l'elenco dei valori dei dati da inserire. Deve essere disponibile un valore per ogni colonna dell'argomento column_list (se specificato) o della tabella. L'elenco di valori deve essere racchiuso tra parentesi.

    Se i valori nell'elenco VALUES non sono nello stesso ordine delle colonne della tabella oppure non è disponibile un valore per ogni colonna della tabella, è necessario utilizzare l'argomento column_list per specificare in modo esplicito la colonna in cui archiviare i valori inseriti.

  • DEFAULT
    Forza il caricamento nel Motore di database del valore predefinito di una colonna. Se per la colonna non esiste alcun valore predefinito e la colonna supporta valori NULL, viene inserito un valore NULL. Per una colonna definita con il tipo di dati timestamp viene inserito il valore timestamp successivo. La parola chiave DEFAULT non è valida per una colonna Identity.
  • expression
    Costante, variabile o espressione. L'espressione non può contenere un'istruzione SELECT o EXECUTE.
  • derived_table
    Qualsiasi istruzione SELECT valida che restituisce righe di dati da caricare nella tabella. L'istruzione SELECT non può contenere un'espressione di tabella comune.
  • execute_statement
    Qualsiasi istruzione EXECUTE valida che restituisce dati con le istruzioni SELECT o READTEXT. L'istruzione SELECT non può contenere un'espressione di tabella comune.

    Se si utilizza execute_statement con INSERT, ogni set di risultati deve essere compatibile con le colonne nella tabella o in column_list.

    È possibile utilizzare l'argomento execute_statement per eseguire stored procedure nello stesso server o in un server remoto. La procedura viene eseguita nel server remoto e i set di risultati vengono restituiti al server locale e caricati nella tabella nel server locale.

    SQL Server 2008 modifica la semantica delle transazioni delle istruzioni INSERT...EXECUTE che vengono eseguite in un server collegato loopback. In SQL Server 2005, tale scenario non è supportato e causa un errore. In SQL Server 2008, è possibile eseguire un'istruzione INSERT...EXECUTE in un server collegato loopback quando per la connessione non è attivato MARS (Multiple Active Result Set). Quando MARS è abilitato sulla connessione, questo comportamento è identico a quello in SQL Server 2005.

    Se execute_statement restituisce dati con l'istruzione READTEXT, ogni istruzione READTEXT può restituire al massimo 1 MB (1024 KB) di dati. È inoltre possibile utilizzare execute_statement con le procedure estese. In questo caso execute_statement inserisce i dati restituiti dal thread principale della procedura estesa. L'output dei thread diversi dal principale, tuttavia, non viene inserito.

  • DEFAULT VALUES
    Forza l'inserimento nella nuova riga dei valori predefiniti associati a ogni colonna.

Osservazioni

L'istruzione INSERT accoda le righe nuove in una tabella. Per sostituire i dati in una tabella, prima di caricare nuovi dati con l'istruzione INSERT, è necessario eseguire le istruzioni DELETE o TRUNCATE TABLE per cancellare i dati esistenti. Per modificare i valori della colonna nelle righe esistenti, utilizzare l'istruzione UPDATE. Per creare una nuova tabella e inserirvi dati in un solo passaggio, utilizzare l'opzione INTO dell'istruzione SELECT.

Nelle colonne di tipo uniqueidentifier vengono archiviati valori binari da 16 byte con una formattazione speciale. Diversamente dalle colonne Identity, il Motore di database non genera automaticamente valori per le colonne di tipo uniqueidentifier. Durante un'operazione di inserimento è possibile utilizzare variabili di tipo uniqueidentifier e costanti stringa nel formato xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 caratteri inclusi i segni meno, dove x è una cifra esadecimale compresa nell'intervallo 0-9 o a-f) per le colonne di tipo uniqueidentifier. Ad esempio, 6F9619FF-8B86-D011-B42D-00C04FC964FF è un valore valido per una variabile o una colonna di tipo uniqueidentifier. Per ottenere un ID univoco globale (GUID), utilizzare la funzione NEWID().

L'impostazione dell'opzione SET ROWCOUNT viene ignorata per istruzioni INSERT eseguite su viste partizionate locali e remote. Questa opzione, inoltre, non è supportata per istruzioni INSERT eseguite su tabelle remote nel Motore di database quando il livello di compatibilità è impostato su 80 o un valore superiore.

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 database come se l'opzione SET ARITHABORT fosse impostata su ON. Il resto del batch viene interrotto e viene restituito un messaggio di errore.

Regole per l'inserimento di righe

Nelle operazioni di inserimento di righe, vengono applicate le regole seguenti:

  • 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 quando è stata creata la tabella. Per ulteriori informazioni, vedere SET ANSI_PADDING (Transact-SQL).
    Nella tabella seguente vengono descritte le operazioni predefinite per SET ANSI_PADDING OFF.

    Tipo di dati Operazione predefinita

    char

    Il valore viene riempito con spazi fino alla larghezza di colonna specificata.

    varchar

    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.

    varbinary

    Gli zeri finali vengono rimossi.

  • 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.

  • 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 il Motore di database visualizza un messaggio di errore.

  • 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. Per ulteriori informazioni sull'inserimento di dati di tipo text e image, vedere Utilizzo delle funzioni text, ntext e image.

  • Se l'istruzione INSERT carica più righe tramite SELECT o EXECUTE e i valori caricati violano una regola o un vincolo, l'intera istruzione viene interrotta e non viene caricata alcuna riga.

  • Se si esegue l'inserimento di valori in tabelle in un'istanza remota del Motore di database e non vengono specificati tutti i valori per tutte le colonne, è necessario identificare le colonne in cui devono essere inseriti i valori specificati.

Utilizzo di trigger INSTEAD OF in azioni INSERT

Se viene definito un trigger INSTEAD OF nelle azioni INSERT eseguite su una tabella o vista, viene eseguito il trigger anziché l'istruzione INSERT. Nelle versioni precedenti di SQL Server sono supportati solo i trigger AFTER definiti in INSERT e altre istruzioni di modifica dei dati. Per ulteriori informazioni sui trigger INSTEAD OF, vedere CREATE TRIGGER (Transact-SQL).

Inserimento di valori in colonne di tipo definito dall'utente

Per inserire valori in colonne di tipo definito dall'utente è possibile:

  • Specificare un valore del tipo definito dall'utente.

  • Specificare un valore con un tipo di dati di sistema di SQL Server 2005, a condizione che il tipo definito dall'utente supporti la conversione implicita o esplicita da tale tipo. Nell'esempio seguente viene illustrato come inserire un valore in una colonna con il tipo definito dall'utente Point, tramite conversione esplicita da una stringa.

    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. Per ulteriori informazione sulla conversione e i tipi definiti dall'utente, vedere Esecuzione di operazioni su tipi definiti dall'utente.

  • Chiamare una funzione definita dall'utente che restituisce un valore con il tipo definito dall'utente. 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.

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

Utilizzo di OPENROWSET e BULK per il caricamento di massa dei dati

Nel Motore di database di SQL Server 2005 i nuovi hint di tabella disponibili per il provider di set di righe con lettura di massa OPENROWSET supportano le ottimizzazioni seguenti per il caricamento di massa con l'istruzione INSERT:

  • Registrazione del caricamento di massa, con riduzione al minimo del numero di record del log per l'operazione di inserimento
  • Possibilità di impostare il controllo dei vincoli su ON o OFF
  • Possibilità di impostare l'esecuzione dei trigger su ON o OFF

Queste ottimizzazioni sono simili a quelle disponibili con il comando BULK INSERT.

Se si utilizza un'istruzione INSERT per eseguire un caricamento di massa in una tabella non vuota, sono disponibili i miglioramenti aggiuntivi seguenti per le prestazioni:

  • Quando una pagina viene divisa durante il caricamento di massa, non è necessario utilizzare la registrazione completa per le nuove righe aggiunte alla pagina.
  • Se la tabella include indici non cluster, ma nessun indice cluster, è necessario utilizzare la registrazione completa per le singole righe di indice ma non è necessario utilizzarla per le righe di dati.

Per ulteriori informazioni, vedere OPENROWSET (Transact-SQL) e table_hint (Transact-SQL).

Autorizzazioni

È richiesta l'autorizzazione INSERT per la tabella di destinazione.

Le autorizzazioni per l'istruzione INSERT vengono assegnate per impostazione predefinita ai membri del ruolo predefinito del server sysadmin, ai ruoli predefiniti del database db_owner e db_datawriter e al proprietario della tabella. I membri dei ruoli sysadmin, db_owner e db_securityadmin e il proprietario della tabella possono trasferire le autorizzazioni ad altri utenti.

Per eseguire INSERT con l'opzione BULK per la funzione OPENROWSET, è necessario essere membri del ruolo predefinito del server sysadmin o del ruolo predefinito del server bulkadmin.

Esempi

A. Utilizzo di un'istruzione INSERT semplice

Nell'esempio seguente viene inserita una riga nella tabella Production.UnitMeasure. Poiché vengono specificati i valori di tutte le colonne nello stesso ordine delle colonne nella tabella, non è necessario specificare i nomi delle colonne in column_list.

USE AdventureWorks;
GO
INSERT INTO Production.UnitMeasure
VALUES (N'F2', N'Square Feet', GETDATE());
GO

B. Inserimento di dati in un ordine diverso rispetto alle colonne della tabella

Nell'esempio seguente viene utilizzato l'argomento column_list per specificare in modo esplicito i valori da inserire in ogni colonna. L'ordine delle colonne nella tabella UnitMeasure è UnitMeasureCode, Name, ModifiedDate. Tuttavia, le colonne non sono elencate in tale ordine in column_list.

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

C. Inserimento di dati con un numero di valori inferiore rispetto alle colonne

Nell'esempio seguente viene illustrato l'inserimento di righe in una tabella con colonne per le quali viene generato automaticamente un valore o è specificato un valore predefinito. Le istruzioni INSERT inseriscono righe che contengono valori solo per alcune delle colonne. Nell'ultima istruzione INSERT non sono specificate colonne e vengono inseriti solo i valori predefiniti.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1 
(
    column_1 int IDENTITY, 
    column_2 varchar(30) 
        CONSTRAINT default_name DEFAULT ('my column default'),
    column_3 timestamp,
    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

D. Inserimento di dati in una tabella che include una colonna Identity

Nell'esempio seguente vengono illustrati diversi metodi per l'inserimento di dati in una colonna Identity. Le prime due istruzioni INSERT consentono di generare valori Identity per le nuove righe. 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.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
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

E. Inserimento di dati in una colonna uniqueidentifier tramite NEWID()

Nell'esempio seguente viene utilizzata la funzione NEWID() per ottenere un GUID per column_2. Diversamente dalle colonne Identity, il Motore di database non genera automaticamente valori per le colonne con il tipo di dati uniqueidentifier, come illustrato nella seconda istruzione INSERT.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
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;
GO

F. Inserimento di dati in una tabella tramite una vista

Nell'esempio seguente viene specificato il nome di una vista nell'istruzione INSERT. Tuttavia, la nuova riga viene inserita nella tabella sottostante della vista. L'ordine dell'elenco VALUES nell'istruzione INSERT deve corrispondere all'ordine delle colonne nella vista.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
IF OBJECT_ID ('dbo.V1', 'V') IS NOT NULL
    DROP VIEW dbo.V1;
GO
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

G. Inserimento di dati utilizzando le opzioni SELECT ed EXECUTE

Nell'esempio seguente vengono illustrati tre metodi diversi per recuperare dati da una tabella e inserirli in un'altra. Ogni metodo è basato su un'istruzione SELECT su più tabelle, in cui l'elenco di colonne include un'espressione e un valore letterale.

La prima istruzione INSERT utilizza direttamente un'istruzione SELECT per recuperare i dati dalle tabelle di origine (Employee, SalesPerson e Contact) e archivia il set di risultati nella tabella EmployeeSales . Nella seconda istruzione INSERT viene eseguita una stored procedure che contiene l'istruzione SELECT. Nella terza istruzione INSERT viene eseguita l'istruzione SELECT come stringa letterale.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
    DROP TABLE dbo.EmployeeSales;
GO
IF OBJECT_ID ('dbo.uspGetEmployeeSales', 'P') IS NOT NULL
    DROP PROCEDURE uspGetEmployeeSales;
GO
CREATE TABLE dbo.EmployeeSales
( DataSource   varchar(20) NOT NULL,
  EmployeeID   varchar(11) NOT NULL,
  LastName     varchar(40) NOT NULL,
  SalesDollars money NOT NULL
);
GO
CREATE PROCEDURE dbo.uspGetEmployeeSales 
AS 
    SET NOCOUNT ON;
    SELECT 'PROCEDURE', e.EmployeeID, c.LastName, 
        sp.SalesYTD 
    FROM HumanResources.Employee AS e 
        INNER JOIN Sales.SalesPerson AS sp  
        ON e.EmployeeID = sp.SalesPersonID 
        INNER JOIN Person.Contact AS c
        ON e.ContactID = c.ContactID
    WHERE e.EmployeeID LIKE '2%'
    ORDER BY e.EmployeeID, c.LastName;
GO
--INSERT...SELECT example
INSERT dbo.EmployeeSales
    SELECT 'SELECT', e.EmployeeID, c.LastName, sp.SalesYTD 
    FROM HumanResources.Employee AS e
        INNER JOIN Sales.SalesPerson AS sp
        ON e.EmployeeID = sp.SalesPersonID 
        INNER JOIN Person.Contact AS c
        ON e.ContactID = c.ContactID
    WHERE e.EmployeeID LIKE '2%'
    ORDER BY e.EmployeeID, c.LastName;
GO
--INSERT...EXECUTE procedure example
INSERT EmployeeSales 
EXECUTE uspGetEmployeeSales;
GO
--INSERT...EXECUTE('string') example
INSERT EmployeeSales 
EXECUTE 
('
SELECT ''EXEC STRING'', e.EmployeeID, c.LastName, 
    sp.SalesYTD 
    FROM HumanResources.Employee AS e 
        INNER JOIN Sales.SalesPerson AS sp 
        ON e.EmployeeID = sp.SalesPersonID 
        INNER JOIN Person.Contact AS c
        ON e.ContactID = c.ContactID
    WHERE e.EmployeeID LIKE ''2%''
    ORDER BY e.EmployeeID, c.LastName
');
GO
--Show results.
SELECT DataSource,EmployeeID,LastName,SalesDollars
FROM dbo.EmployeeSales;
GO

H. Inserimento di dati utilizzando la clausola TOP

Nell'esempio seguente viene creata la tabella NewEmployee e in tale tabella vengono inseriti i dati relativi all'indirizzo per i primi 10 dipendenti dalla tabella Employee. L'istruzione SELECT viene quindi eseguita per verificare il contenuto della tabella NewEmployee.

USE AdventureWorks;
GO
IF OBJECT_ID (N'HumanResources.NewEmployee', N'U') IS NOT NULL
    DROP TABLE HumanResources.NewEmployee;
GO
CREATE TABLE HumanResources.NewEmployee
(
    EmployeeID int NOT NULL,
    LastName nvarchar(50) NOT NULL,
    FirstName nvarchar(50) NOT NULL,
    Phone 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
INSERT TOP (10) INTO HumanResources.NewEmployee 
    SELECT
       e.EmployeeID, c.LastName, c.FirstName, c.Phone,
       a.AddressLine1, a.City, sp.StateProvinceCode, 
       a.PostalCode, e.CurrentFlag
    FROM HumanResources.Employee e
        INNER JOIN HumanResources.EmployeeAddress AS ea
        ON e.EmployeeID = ea.EmployeeID
        INNER JOIN Person.Address AS a
        ON ea.AddressID = a.AddressID
        INNER JOIN Person.StateProvince AS sp
        ON a.StateProvinceID = sp.StateProvinceID
        INNER JOIN Person.Contact as c
        ON e.ContactID = c.ContactID;
GO
SELECT  EmployeeID, LastName, FirstName, Phone,
        AddressLine1, City, State, PostalCode, CurrentFlag
FROM HumanResources.NewEmployee;
GO

I. Utilizzo della clausola OUTPUT con un'istruzione INSERT

Nell'esempio seguente viene inserita una riga nella tabella ScrapReason e viene utilizzata la clausola OUTPUT per restituire i risultati dell'istruzione alla variabile @MyTableVartable. Poiché la colonna ScrapReasonID è definita con una proprietà IDENTITY, per tale colonna non viene specificato un valore nell'istruzione INSERT. Si noti, tuttavia, che il valore generato dal Motore di database per tale colonna viene restituito nella clausola OUTPUT nella colonna INSERTED.ScrapReasonID.

USE AdventureWorks;
GO
DECLARE @MyTableVar table( ScrapReasonID 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 ScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate 
FROM Production.ScrapReason;
GO

J. Utilizzo di WITH con un'espressione di tabella comune in un'istruzione INSERT

Nell'esempio seguente viene creata la tabella NewEmployee. Le righe da inserire nella tabella NewEmployee vengono definite tramite un'espressione di tabella comune (EmployeeTemp). L'istruzione INSERT fa riferimento alle colonne nell'espressione di tabella comune.

USE AdventureWorks;
GO
IF OBJECT_ID (N'HumanResources.NewEmployee', N'U') IS NOT NULL
    DROP TABLE HumanResources.NewEmployee;
GO
CREATE TABLE HumanResources.NewEmployee
(
    EmployeeID int NOT NULL,
    LastName nvarchar(50) NOT NULL,
    FirstName nvarchar(50) NOT NULL,
    Phone 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.EmployeeID, c.LastName, c.FirstName, c.Phone,
        a.AddressLine1, a.City, sp.StateProvinceCode, 
        a.PostalCode, e.CurrentFlag
    FROM HumanResources.Employee e
        INNER JOIN HumanResources.EmployeeAddress AS ea
        ON e.EmployeeID = ea.EmployeeID
        INNER JOIN Person.Address AS a
        ON ea.AddressID = a.AddressID
        INNER JOIN Person.StateProvince AS sp
        ON a.StateProvinceID = sp.StateProvinceID
        INNER JOIN Person.Contact as c
        ON e.ContactID = c.ContactID
    )
INSERT INTO HumanResources.NewEmployee 
    SELECT EmpID, LastName, FirstName, Phone, 
           Address, City, StateProvince, PostalCode, CurrentFlag
    FROM EmployeeTemp;
GO

K. Utilizzo della clausola OUTPUT con colonne Identity e calcolate

Nell'esempio seguente viene creata la tabella EmployeeSales e quindi vengono inserite varie righe in tale tabella tramite un'istruzione INSERT con un'istruzione SELECT per il recupero dei dati dalle tabelle di origine. La tabella EmployeeSales include una colonna Identity (EmployeeID) e una colonna calcolata (ProjectedSales). Poiché questi valori vengono generati dal Motore di database durante l'operazione di inserimento, nessuna di queste colonne può essere definita in @MyTableVar.

USE AdventureWorks ;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
    DROP TABLE dbo.EmployeeSales;
GO
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 HumanResources.Employee AS e
        INNER JOIN Sales.SalesPerson AS sp
        ON e.EmployeeID = sp.SalesPersonID 
        INNER JOIN Person.Contact AS c
        ON e.ContactID = c.ContactID
    WHERE e.EmployeeID LIKE '2%'
    ORDER BY c.LastName, c.FirstName;

SELECT LastName, FirstName, CurrentSales
FROM @MyTableVar;
GO
SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales
FROM dbo.EmployeeSales;
GO

Vedere anche

Riferimento

BULK INSERT (Transact-SQL)
CREATE TABLE (Transact-SQL)
DELETE (Transact-SQL)
EXECUTE (Transact-SQL)
FROM (Transact-SQL)
IDENTITY (proprietà) (Transact-SQL)
NEWID (Transact-SQL)
SELECT (Transact-SQL)
SET ROWCOUNT (Transact-SQL)
UPDATE (Transact-SQL)

Altre risorse

Inserimento di dati in una tabella

Guida in linea e informazioni

Assistenza su SQL Server 2005