Dela via


INSERT (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)Lager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

Lägger till en eller flera rader i en tabell eller en vy i SQL Server. Exempel finns i Exempel.

Transact-SQL syntaxkonventioner

Syntax

Syntax för SQL Server och Azure SQL Database och Fabric SQL-databas

-- Syntax for SQL Server and Azure SQL Database and Fabric 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 för Azure Synapse Analytics och Parallel Data Warehouse och Microsoft Fabric Warehouse

-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse and Microsoft Fabric

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 ] ) ]  
[;]  

Arguments

MED <common_table_expression>
Anger den tillfälliga namngivna resultatuppsättningen, även kallat common table expression, som definierats inom insert-instruktionens omfång. Resultatuppsättningen härleds från en SELECT-instruktion. Mer information finns i WITH common_table_expression (Transact-SQL).

TOP (uttryck) [ PROCENT ]
Anger antalet eller procenten av slumpmässiga rader som ska infogas. uttryck kan vara antingen ett tal eller en procent av raderna. Mer information finns i TOP (Transact-SQL).

INTO
Är ett valfritt nyckelord som kan användas mellan INSERT och måltabellen.

server_name
gäller för: SQL Server 2008 (10.0.x) och senare.

Är namnet på den länkade server där tabellen eller vyn finns. server_name kan anges som ett länkat servernamn eller med funktionen OPENDATASOURCE .

När server_name anges som en länkad server krävs database_name och schema_name . När server_name anges med OPENDATASOURCE kanske database_name och schema_name inte gäller för alla datakällor och omfattas av funktionerna hos OLE DB-providern som har åtkomst till fjärrobjektet.

database_name
gäller för: SQL Server 2008 (10.0.x) och senare.

Är namnet på databasen.

schema_name
Är namnet på schemat som tabellen eller vyn tillhör.

table_or view_name
Är namnet på tabellen eller vyn som ska ta emot data.

En tabellvariabel inom dess omfång kan användas som en tabellkälla i en INSERT-instruktion.

Vyn som refereras av table_or_view_name måste vara uppdaterad och referera till exakt en bastabell i FROM-satsen i vyn. Till exempel måste en INSERT i en vy med flera tabeller använda en column_list som endast refererar till kolumner från en bastabell. Mer information om uppdateringsbara vyer finns i CREATE VIEW (Transact-SQL).

rowset_function_limited
gäller för: SQL Server 2008 (10.0.x) och senare.

Är antingen funktionen OPENQUERY eller OPENROWSET . Användningen av dessa funktioner omfattas av funktionerna i OLE DB-providern som har åtkomst till fjärrobjektet.

MED ( <table_hint_limited> [... n ] )
Anger en eller flera tabelltips som tillåts för en måltabell. Nyckelordet WITH och parenteserna krävs.

READPAST, NOLOCK och READUNCOMMITTED tillåts inte. Mer information om tabelltips finns i Tabelltips (Transact-SQL).

Important

Möjligheten att ange TIPS om HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD eller UPDLOCK för tabeller som är mål för INSERT-instruktioner tas bort i en framtida version av SQL Server. Dessa tips påverkar inte prestandan för INSERT-instruktioner. Undvik att använda dem i nytt utvecklingsarbete och planera att ändra program som för närvarande använder dem.

Att ange TABLOCK-tipset i en tabell som är målet för en INSERT-instruktion har samma effekt som att ange TABLOCKX-tipset. Ett exklusivt lås tas på bordet.

(column_list)
Är en lista över en eller flera kolumner där data ska infogas. column_list måste omges av parenteser och avgränsas med kommatecken.

Om en kolumn inte finns i column_list måste databasmotorn kunna ange ett värde baserat på definitionen av kolumnen. Annars går det inte att läsa in raden. Databasmotorn ger automatiskt ett värde för kolumnen om kolumnen:

  • Har en identitetsegenskap. Nästa inkrementella identitetsvärde används.

  • Har ett standardvärde. Standardvärdet för kolumnen används.

  • Har en tidsstämpeldatatyp . Det aktuella tidsstämpelvärdet används.

  • Is nullable. Ett null-värde används.

  • Är en beräknad kolumn. Det beräknade värdet används.

column_list måste användas när explicita värden infogas i en identitetskolumn och alternativet SET IDENTITY_INSERT måste vara PÅ för tabellen.

OUTPUT Clause
Returnerar infogade rader som en del av infogningsåtgärden. Resultatet kan returneras till bearbetningsprogrammet eller infogas i en tabell- eller tabellvariabel för vidare bearbetning.

OUTPUT-satsen stöds inte i DML-instruktioner som refererar till lokala partitionerade vyer, distribuerade partitionerade vyer eller fjärrtabeller eller INSERT-instruktioner som innehåller en execute_statement. OUTPUT INTO-satsen stöds inte i INSERT-instruktioner som innehåller en <dml_table_source-sats> . Mer information om argumenten och beteendet för den här satsen finns i OUTPUT-satsen (Transact-SQL).

VALUES
Introducerar listan eller listan med datavärden som ska infogas. Det måste finnas ett datavärde för varje kolumn i column_list, om det anges eller i tabellen. Värdelistan måste omges av parenteser.

Om värdena i listan Värde inte är i samma ordning som kolumnerna i tabellen eller inte har något värde för varje kolumn i tabellen, måste column_list användas för att uttryckligen ange kolumnen som lagrar varje inkommande värde.

Du kan använda Transact-SQL radkonstruktorn (kallas även tabellvärdekonstruktor) för att ange flera rader i en enda INSERT-instruktion. Radkonstruktorn består av en enskild VALUES-sats med flera värdelistor inom parenteser och avgränsade med kommatecken. Mer information finns i Table Value Constructor (Transact-SQL).

Note

Tabellvärdekonstruktor stöds inte i Azure Synapse Analytics. I stället kan efterföljande INSERT instruktioner köras för att infoga flera rader. I Azure Synapse Analytics kan infogningsvärden endast vara konstanta literalvärden eller variabelreferenser. Om du vill infoga en icke-literal anger du en variabel till ett icke-konstant värde och infogar variabeln.

DEFAULT
Tvingar databasmotorn att läsa in standardvärdet som definierats för en kolumn. Om det inte finns något standardvärde för kolumnen och kolumnen tillåter null-värden infogas NULL. För en kolumn som definierats med tidsstämpelns datatyp infogas nästa tidsstämpelvärde. STANDARDvärdet är inte giltigt för en identitetskolumn.

expression
Är en konstant, en variabel eller ett uttryck. Uttrycket får inte innehålla en EXECUTE-instruktion.

När du refererar till Unicode-teckendatatyperna nchar, nvarchar och ntext ska "uttryck" vara prefixet med versal bokstaven "N". Om "N" inte har angetts konverterar SQL Server strängen till den kodsida som motsvarar standardsortering av databasen eller kolumnen. Alla tecken som inte hittas på den här kodsidan går förlorade.

derived_table
Är en giltig SELECT-instruktion som returnerar rader med data som ska läsas in i tabellen. SELECT-instruktionen får inte innehålla ett gemensamt tabelluttryck (CTE).

execute_statement
Är en giltig EXECUTE-instruktion som returnerar data med SELECT- eller READTEXT-instruktioner. Mer information finns i EXECUTE (Transact-SQL).

Alternativen för RESULT SETS för EXECUTE-instruktionen kan inte anges i en INSERT... EXEC-instruktion.

Om execute_statement används med INSERT måste varje resultatuppsättning vara kompatibel med kolumnerna i tabellen eller i column_list.

execute_statement kan användas för att köra lagrade procedurer på samma server eller en fjärrserver. Proceduren på fjärrservern körs och resultatuppsättningarna returneras till den lokala servern och läses in i tabellen på den lokala servern. I en distribuerad transaktion kan execute_statement inte utfärdas mot en länkad loopback-server när anslutningen har flera aktiva resultatuppsättningar (MARS) aktiverade.

Om execute_statement returnerar data med READTEXT-instruktionen kan varje READTEXT-instruktion returnera högst 1 MB (1 024 KB) data. execute_statement kan också användas med utökade procedurer. execute_statement infogar data som returneras av huvudtråden i den utökade proceduren. Utdata från andra trådar än huvudtråden infogas dock inte.

Du kan inte ange en tabellvärdeparameter som mål för en INSERT EXEC-instruktion. Det kan dock anges som en källa i INSERT EXEC-strängen eller lagrad procedur. Mer information finns i Använda Table-Valued parametrar (databasmotor).

<dml_table_source>
Anger att de rader som infogas i måltabellen är de som returneras av UTDATA-satsen i en INSERT-, UPDATE-, DELETE- eller MERGE-instruktion, som eventuellt filtreras efter en WHERE-sats. Om <dml_table_source> anges måste målet för den yttre INSERT-instruktionen uppfylla följande begränsningar:

  • Det måste vara en bastabell, inte en vy.

  • Det kan inte vara en fjärrtabell.

  • Det kan inte ha några utlösare definierade på den.

  • Den kan inte delta i några primära nyckel-sekundärnyckelrelationer.

  • Den kan inte delta i sammanslagningsreplikering eller uppdateringsbara prenumerationer för transaktionsreplikering.

Databasens kompatibilitetsnivå måste vara inställd på 100 eller högre. Mer information finns i OUTPUT-sats (Transact-SQL).

<select_list>
Är en kommaavgränsad lista som anger vilka kolumner som returneras av output-satsen som ska infogas. Kolumnerna i <select_list> måste vara kompatibla med kolumnerna i vilka värden infogas. < > select_list kan inte referera till mängdfunktioner eller TEXTPTR.

Note

Alla variabler som anges i SELECT-listan refererar till deras ursprungliga värden, oavsett eventuella ändringar som gjorts i <dml_statement_with_output_clause>.

<dml_statement_with_output_clause>
Är en giltig INSERT-, UPDATE-, DELETE- eller MERGE-instruktion som returnerar berörda rader i en OUTPUT-sats. Instruktionen får inte innehålla en WITH-sats och kan inte riktas mot fjärrtabeller eller partitionerade vyer. Om UPDATE eller DELETE har angetts kan det inte vara en markörbaserad UPPDATERING eller DELETE. Källrader kan inte refereras till som kapslade DML-instruktioner.

WHERE <search_condition>
Är en WHERE-sats som innehåller en giltig <search_condition> som filtrerar raderna som returneras av dml_statement_with_output_clause.>< Mer information finns i sökvillkor (Transact-SQL). När den används i den här kontexten <kan search_condition> inte innehålla underfrågor, skalära användardefinierade funktioner som utför dataåtkomst, aggregerade funktioner, TEXTPTR eller fulltextsökningspredikat.

DEFAULT VALUES
gäller för: SQL Server 2008 (10.0.x) och senare.

Tvingar den nya raden att innehålla standardvärdena som definierats för varje kolumn.

BULK
gäller för: SQL Server 2008 (10.0.x) och senare.

Används av externa verktyg för att ladda upp en binär dataström. Det här alternativet är inte avsett för användning med verktyg som SQL Server Management Studio, SQLCMD, OSQL eller programmeringsgränssnitt för dataåtkomstprogram, till exempel SQL Server Native Client.

FIRE_TRIGGERS
gäller för: SQL Server 2008 (10.0.x) och senare.

Anger att alla infogningsutlösare som definierats i måltabellen körs under överföringsåtgärden för binär dataström. Mer information finns i BULK INSERT (Transact-SQL).

CHECK_CONSTRAINTS
gäller för: SQL Server 2008 (10.0.x) och senare.

Anger att alla begränsningar i måltabellen eller vyn måste kontrolleras under överföringsåtgärden för binär dataström. Mer information finns i BULK INSERT (Transact-SQL).

KEEPNULLS
gäller för: SQL Server 2008 (10.0.x) och senare.

Anger att tomma kolumner ska behålla ett null-värde under uppladdningen av binära dataströmmar. Mer information finns i Behåll nullvärden eller Använd standardvärden under massimport (SQL Server).

KILOBYTES_PER_BATCH = kilobytes_per_batch
Anger det ungefärliga antalet kilobyte (KB) data per batch som kilobytes_per_batch. Mer information finns i BULK INSERT (Transact-SQL).

ROWS_PER_BATCH =rows_per_batch
gäller för: SQL Server 2008 (10.0.x) och senare.

Anger det ungefärliga antalet rader med data i den binära dataströmmen. Mer information finns i BULK INSERT (Transact-SQL).

Note

Ett syntaxfel utlöses om en kolumnlista inte har angetts.

Remarks

Information som är specifik för att infoga data i SQL-graftabeller finns i INSERT (SQL Graph).

Best Practices

Använd funktionen @@ROWCOUNT för att returnera antalet infogade rader till klientprogrammet. Mer information finns i @@ROWCOUNT (Transact-SQL).

Metodtips för massimport av data

Använder INSERT INTO... VÄLJ för massimport av data med minimal loggning och parallellitet

Du kan använda INSERT INTO <target_table> SELECT <columns> FROM <source_table> för att effektivt överföra ett stort antal rader från en tabell, till exempel en mellanlagringstabell, till en annan tabell med minimal loggning. Minimal loggning kan förbättra prestanda för instruktionen och minska risken för att åtgärden fyller det tillgängliga transaktionsloggutrymmet under transaktionen.

Minimal loggning för den här instruktionen har följande krav:

  • Databasens återställningsmodell är inställd på enkel eller massloggad.
  • Måltabellen är en tom eller icke-tom heap.
  • Måltabellen används inte i replikering.
  • Tipset TABLOCK anges för måltabellen.

Rader som infogas i en heap som ett resultat av en infogningsåtgärd i en MERGE-instruktion kan också loggas minimalt.

Till skillnad från -instruktionen BULK INSERT , som innehåller ett mindre restriktivt BU-lås (Massuppdatering), INSERT INTO … SELECT innehåller tipset TABLOCK ett exklusivt lås (X) på tabellen. Det innebär att du inte kan infoga rader med flera infogningsåtgärder som körs samtidigt.

Från och med SQL Server 2016 (13.x) och databaskompatibilitetsnivå 130 kan en enda INSERT INTO … SELECT instruktion köras parallellt när du infogar i heaps eller klustrade kolumnlagringsindex (CCI). Parallella infogningar är möjliga när du använder tipset TABLOCK .

Parallellitet för -instruktionen ovan har följande krav, som liknar kraven för minimal loggning:

  • Måltabellen är en tom eller icke-tom heap.
  • Måltabellen har ett grupperat kolumnlagringsindex (CCI) men inga icke-klustrade index.
  • Måltabellen har ingen identitetskolumn med IDENTITY_INSERT inställt på OFF.
  • Tipset TABLOCK anges för måltabellen.

För scenarier där kraven för minimal loggning och parallell infogning uppfylls fungerar båda förbättringarna tillsammans för att säkerställa maximalt dataflöde för dina datainläsningsåtgärder.

Mer information om hur du använder INSERT på ditt lager i Microsoft Fabric finns i Mata in data i ditt lager med Hjälp av Transact-SQL.

Note

Infogningar i lokala temporära tabeller (identifieras av #-prefixet) och globala temporära tabeller (identifieras av ##-prefix) aktiveras också för parallellitet med hjälp av TABLOCK-tipset.

Använda OPENROWSET och BULK för att massimportera data

Funktionen OPENROWSET kan acceptera följande tabelltips, som ger massinläsningsoptimeringar med INSERT-instruktionen:

  • Tipset TABLOCK kan minimera antalet loggposter för infogningsåtgärden. Databasens återställningsmodell måste vara enkel eller massloggad och måltabellen kan inte användas vid replikering. Mer information finns i Krav för minimal loggning i massimport.
  • Tipset TABLOCK kan aktivera parallella infogningsåtgärder. Måltabellen är ett heap- eller klustrade kolumnlagringsindex (CCI) utan icke-klustrade index, och måltabellen kan inte ha en angiven identitetskolumn.
  • Tipset IGNORE_CONSTRAINTS kan tillfälligt inaktivera begränsningskontroll av SEKUNDÄRNYCKEL och CHECK.
  • Tipset IGNORE_TRIGGERS kan tillfälligt inaktivera utlösarkörning.
  • Med KEEPDEFAULTS tipset kan du infoga en tabellkolumns standardvärde, om det finns något, i stället för NULL när dataposten saknar ett värde för kolumnen.
  • Med KEEPIDENTITY tipset kan identitetsvärdena i den importerade datafilen användas för identitetskolumnen i måltabellen.

Dessa optimeringar liknar de som är tillgängliga med BULK INSERT kommandot . Mer information finns i Tabelltips (Transact-SQL).

Data Types

När du infogar rader bör du tänka på följande datatypsbeteende:

  • Om ett värde läses in i kolumner med en tecken-, varchar- eller varbinär datatyp bestäms utfyllnad eller trunkering av avslutande blanksteg (blanksteg för tecken och varchar, nollor för varbinary) av inställningen SET ANSI_PADDING som definierats för kolumnen när tabellen skapades. Mer information finns i SET ANSI_PADDING (Transact-SQL).

    I följande tabell visas standardåtgärden för SET ANSI_PADDING OFF.

    Data type Default operation
    char Pad-värde med blanksteg till den definierade bredden på kolumnen.
    varchar Ta bort avslutande blanksteg till det sista icke-blankstegstecknet eller till ett enda blankstegstecken för strängar som endast består av blanksteg.
    varbinary Ta bort avslutande nollor.
  • Om en tom sträng (' ') läses in i en kolumn med datatypen varchar eller text är standardåtgärden att läsa in en sträng med noll längd.

  • Om du infogar ett null-värde i en text - eller bildkolumn skapas ingen giltig textpekare, och den förallokerar inte heller en textsida på 8 KB.

  • Kolumner som skapats med datatypen uniqueidentifier lagrar särskilt formaterade binära värden på 16 byte. Till skillnad från med identitetskolumner genererar databasmotorn inte automatiskt värden för kolumner med datatypen uniqueidentifier . Under en infogningsåtgärd kan variabler med en datatyp av unikaidentifierare och strängkonstanter i formatet xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx (36 tecken inklusive bindestreck, där x är en hexadecimal siffra i intervallet 0-9 eller a-f) användas för unikaidentifierarkolumner . Till exempel är 6F9619FF-8B86-D011-B42D-00C04FC964FF ett giltigt värde för en unikidentifierarvariabel eller kolumn. Använd funktionen NEWID() för att hämta ett globalt unikt ID (GUID).

Infoga värden i User-Defined typkolumner

Du kan infoga värden i användardefinierade typkolumner genom att:

  • Anger ett värde av den användardefinierade typen.

  • Ange ett värde i en SQL Server-systemdatatyp, så länge den användardefinierade typen stöder implicit eller explicit konvertering från den typen. I följande exempel visas hur du infogar ett värde i en kolumn av användardefinierad typ Pointgenom att uttryckligen konvertera från en sträng.

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

    Ett binärt värde kan också anges utan explicit konvertering, eftersom alla användardefinierade typer implicit kan konverteras från binärt värde.

  • Anropa en användardefinierad funktion som returnerar ett värde av den användardefinierade typen. I följande exempel används en användardefinierad funktion CreateNewPoint() för att skapa ett nytt värde av användardefinierad typ Point och infoga värdet i Cities tabellen.

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

Error Handling

Du kan implementera felhantering för INSERT-instruktionen genom att ange -instruktionen i ett TRY... CATCH-konstruktion.

Om en INSERT-instruktion bryter mot en begränsning eller regel, eller om den har ett värde som inte är kompatibelt med kolumnens datatyp, misslyckas instruktionen och ett felmeddelande returneras.

Om INSERT läser in flera rader med SELECT eller EXECUTE stoppas alla överträdelser av en regel eller begränsning som inträffar från de värden som läses in, och inga rader läses in.

När en INSERT-instruktion påträffar ett aritmetikfel (spill, dividera med noll eller ett domänfel) som inträffar under uttrycksutvärderingen hanterar databasmotorn dessa fel som om SET ARITHABORT är inställt på PÅ. Batchen stoppas och ett felmeddelande returneras. Under uttrycksutvärderingen när SET ARITHABORT och SET ANSI_WARNINGS är AV, om en INSERT-, DELETE- eller UPDATE-instruktion stöter på ett aritmetiskt fel, spill, dividera efter noll eller ett domänfel infogar eller uppdaterar SQL Server ett NULL-värde. Om målkolumnen inte kan ogiltigförklaras misslyckas åtgärden infoga eller uppdatera och användaren får ett fel.

Interoperability

När en INSTEAD OF utlösare definieras för INSERT-åtgärder mot en tabell eller vy körs utlösaren i stället för INSERT-instruktionen. Mer information om INSTEAD OF utlösare finns i CREATE TRIGGER (Transact-SQL).

Begränsningar och restriktioner

När du infogar värden i fjärrtabeller och inte alla värden för alla kolumner anges, måste du identifiera de kolumner som de angivna värdena ska infogas i.

När TOP används med INSERT ordnas inte de refererade raderna i någon ordning och ORDER BY-satsen kan inte anges direkt i dessa instruktioner. Om du behöver använda TOP för att infoga rader i en meningsfull kronologisk ordning måste du använda TOP tillsammans med en ORDER BY-sats som anges i en undermarkeringsinstruktion. Se avsnittet Exempel som följer i det här avsnittet.

INSERT-frågor som använder SELECT med ORDER BY för att fylla i rader garanterar hur identitetsvärden beräknas men inte i vilken ordning raderna infogas.

I Parallel Data Warehouse är ORDER BY-satsen ogiltig i VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, inline functions, derived tables, subqueries och common table expressions, såvida inte TOP också har angetts.

Logging Behavior

INSERT-instruktionen är alltid helt loggad förutom när du använder funktionen OPENROWSET med nyckelordet BULK eller när du använder INSERT INTO <target_table> SELECT <columns> FROM <source_table>. Dessa åtgärder kan loggas minimalt. Mer information finns i avsnittet "Metodtips för massinläsning av data" tidigare i det här avsnittet.

Security

Under en länkad serveranslutning tillhandahåller den sändande servern ett inloggningsnamn och lösenord för att ansluta till den mottagande servern för dess räkning. För att anslutningen ska fungera måste du skapa en inloggningsmappning mellan de länkade servrarna med hjälp av sp_addlinkedsrvlogin.

När du använder OPENROWSET(BULK...) är det viktigt att förstå hur SQL Server hanterar personifiering. Mer information finns i "Säkerhetsöverväganden" i Importera massdata med HJÄLP av BULK INSERT eller OPENROWSET(BULK...) (SQL Server).

Permissions

INSERT-behörighet krävs i måltabellen.

INSERT-behörigheter är standard för medlemmar i den sysadmin fasta serverrollen, de fasta databasrollerna db_owner och db_datawriter tabellägaren. Medlemmar i rollerna sysadmin, db_owneroch db_securityadmin och tabellägaren kan överföra behörigheter till andra användare.

Om du vill köra INSERT med alternativet OPENROWSET-funktionen BULK måste du vara medlem i den sysadmin fasta serverrollen eller den fasta serverrollen bulkadmin .

Examples

Category Aktuella syntaxelement
Basic syntax INSERT * tabellvärdekonstruktor
Hantera kolumnvärden Identitet * NEWID * standardvärden * användardefinierade typer
Infoga data från andra tabeller INFOGA... VÄLJ * INFOGA... EXECUTE * WITH common table expression * TOP * OFFSET FETCH
Ange andra målobjekt än standardtabeller Vyer * tabellvariabler
Infoga rader i en fjärrtabell Länkad server * funktionen OPENQUERY rowset * funktionen OPENDATASOURCE rowset
Massinläsning av data från tabeller eller datafiler INFOGA... SELECT * OPENROWSET-funktion
Åsidosätta standardbeteendet för frågeoptimeraren med hjälp av tips Table hints
Samla in resultatet av INSERT-instruktionen OUTPUT clause

Basic Syntax

Exempel i det här avsnittet visar de grundläggande funktionerna i INSERT-instruktionen med den minsta syntax som krävs.

A. Infoga en enskild rad med data

I följande exempel infogas en rad i Production.UnitMeasure tabellen i databasen AdventureWorks2022. Kolumnerna i den här tabellen är UnitMeasureCode, Nameoch ModifiedDate. Eftersom värden för alla kolumner anges och visas i samma ordning som kolumnerna i tabellen behöver kolumnnamnen inte anges i kolumnlistan*.*

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

B. Infoga flera rader med data

I följande exempel används tabellvärdekonstruktorn för att infoga tre rader i Production.UnitMeasure tabellen i databasen AdventureWorks2022 i en enda INSERT-instruktion. Eftersom värden för alla kolumner anges och visas i samma ordning som kolumnerna i tabellen behöver kolumnnamnen inte anges i kolumnlistan.

Note

Tabellvärdekonstruktorn stöds inte i Azure Synapse Analytics.

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

C. Infoga data som inte är i samma ordning som tabellkolumnerna

I följande exempel används en kolumnlista för att uttryckligen ange de värden som infogas i varje kolumn. Kolumnordningen Production.UnitMeasure i tabellen i databasen AdventureWorks2022 är UnitMeasureCode, Name, ModifiedDate, men kolumnerna visas inte i den ordningen i column_list.

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

Hantera kolumnvärden

Exempel i det här avsnittet visar metoder för att infoga värden i kolumner som definieras med en identitetsegenskap, standardvärde eller som definieras med datatyper som unikaidentifierare eller användardefinierade typkolumner.

D. Infoga data i en tabell med kolumner som har standardvärden

I följande exempel visas hur du infogar rader i en tabell med kolumner som automatiskt genererar ett värde eller har ett standardvärde. Column_1 är en beräknad kolumn som automatiskt genererar ett värde genom att sammanfoga en sträng med värdet infogat i column_2. Column_2 definieras med en standardbegränsning. Om inget värde har angetts för den här kolumnen används standardvärdet. Column_3 definieras med datatypen rowversion , som automatiskt genererar ett unikt, inkrementellt binärt tal. Column_4 genererar inte automatiskt ett värde. När ett värde för den här kolumnen inte har angetts infogas NULL. INSERT-uttrycken infogar rader som innehåller värden för vissa kolumner, men inte alla. I den senaste INSERT-instruktionen anges inga kolumner och endast standardvärdena infogas med hjälp av DEFAULT VALUES-satsen.

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. Infoga data i en tabell med en identitetskolumn

I följande exempel visas olika metoder för att infoga data i en identitetskolumn. De första två INSERT-uttrycken tillåter att identitetsvärden genereras för de nya raderna. Den tredje INSERT-instruktionen åsidosätter egenskapen IDENTITY för kolumnen med instruktionen SET IDENTITY_INSERT och infogar ett explicit värde i identitetskolumnen.

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. Infoga data i en unikidentifierarkolumn med hjälp av NEWID()

I följande exempel används funktionen NEWID() för att hämta ett GUID för column_2. Till skillnad från för identitetskolumner genererar databasmotorn inte automatiskt värden för kolumner med datatypen uniqueidentifier , vilket visas i den andra INSERT instruktionen.

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. Infoga data i användardefinierade typkolumner

Följande Transact-SQL-instruktioner infogar tre rader i PointValue kolumnen i Points tabellen. Den här kolumnen använder en CLR-användardefinierad typ (UDT). Den Point datatypen består av X- och Y-heltalsvärden som exponeras som egenskaper för UDT. Du måste använda antingen funktionen CAST eller CONVERT för att omvandla kommaavgränsade X- och Y-värden till Point typen. De två första uttrycken använder funktionen CONVERT för att konvertera ett strängvärde till Point typen, och den tredje instruktionen använder funktionen CAST. Mer information finns i Manipulera 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));  

Infoga data från andra tabeller

Exempel i det här avsnittet visar metoder för att infoga rader från en tabell i en annan tabell.

H. Använda alternativen SELECT och EXECUTE för att infoga data från andra tabeller

I följande exempel visas hur du infogar data från en tabell i en annan tabell med hjälp av INSERT... VÄLJ eller INFOGA... UTFÖRA. Var och en baseras på en SELECT-instruktion med flera tabeller som innehåller ett uttryck och ett literalvärde i kolumnlistan.

Den första INSERT-instruktionen använder en SELECT-instruktion för att härleda data från källtabellerna (Employee, SalesPersonoch Person) i databasen AdventureWorks2022 och lagra resultatuppsättningen EmployeeSales i tabellen. Den andra INSERT-instruktionen använder EXECUTE-satsen för att anropa en lagrad procedur som innehåller SELECT-instruktionen, och den tredje INSERT använder EXECUTE-satsen för att referera till SELECT-instruktionen som en literalsträng.

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. Använda ETT gemensamt tabelluttryck för att definiera de data som infogas

I följande exempel skapas NewEmployee tabellen i databasen AdventureWorks2022. Ett vanligt tabelluttryck (EmployeeTemp) definierar raderna från en eller flera tabeller som ska infogas i NewEmployee tabellen. INSERT-instruktionen refererar till kolumnerna i det gemensamma tabelluttrycket.

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. Använda TOP för att begränsa data som infogats från källtabellen

I följande exempel skapas tabellen EmployeeSales och namnet och försäljningsdata för hittills i år infogas för de 5 främsta slumpmässiga anställda från tabellen HumanResources.Employee i databasen AdventureWorks2022. INSERT-instruktionen väljer alla 5 rader som returneras av -instruktionen SELECT . UTDATA-satsen visar de rader som infogas i EmployeeSales tabellen. Observera att ORDER BY-satsen i SELECT-instruktionen inte används för att fastställa de 5 främsta anställda.

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;  

Om du måste använda TOP för att infoga rader i en meningsfull kronologisk ordning måste du använda TOP tillsammans med ORDER BY i en undermarkeringssats som visas i följande exempel. UTDATA-satsen visar de rader som infogas i EmployeeSales tabellen. Observera att de 5 främsta anställda nu infogas baserat på resultatet av ORDER BY-satsen i stället för slumpmässiga rader.

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;  

Ange andra målobjekt än standardtabeller

Exempel i det här avsnittet visar hur du infogar rader genom att ange en vy- eller tabellvariabel.

K. Infoga data genom att ange en vy

I följande exempel anges ett visningsnamn som målobjekt. Den nya raden infogas dock i den underliggande bastabellen. Ordningen på värdena i -instruktionen INSERT måste matcha kolumnordningen i vyn. Mer information finns i Ändra data via en vy.

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. Infoga data i en tabellvariabel

I följande exempel anges en tabellvariabel som målobjekt i databasen AdventureWorks2022.

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

Infoga rader i en fjärrtabell

Exempel i det här avsnittet visar hur du infogar rader i en fjärrmåltabell med hjälp av en länkad server eller en raduppsättningsfunktion för att referera till fjärrtabellen.

M. Infoga data i en fjärrtabell med hjälp av en länkad server

I följande exempel infogas rader i en fjärrtabell. Exemplet börjar med att skapa en länk till fjärrdatakällan med hjälp av sp_addlinkedserver. Det länkade servernamnet, MyLinkServer, anges sedan som en del av objektnamnet i fyra delar i formuläret server.catalog.schema.object.

gäller för: SQL Server 2008 (10.0.x) och senare.

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'AdventureWorks2022';  
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.AdventureWorks2022.HumanResources.Department (Name, GroupName)  
VALUES (N'Public Relations', N'Executive General and Administration');  
GO  

N. Infoga data i en fjärrtabell med funktionen OPENQUERY

I följande exempel infogas en rad i en fjärrtabell genom att ange funktionen OPENQUERY rowset. Det länkade servernamnet som skapades i föregående exempel används i det här exemplet.

gäller för: SQL Server 2008 (10.0.x) och senare.

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

O. Infoga data i en fjärrtabell med funktionen OPENDATASOURCE

I följande exempel infogas en rad i en fjärrtabell genom att ange funktionen OPENDATASOURCE-raduppsättning . Ange ett giltigt servernamn för datakällan med hjälp av formatet server_name eller server_name\instance_name.

gäller för: SQL Server 2008 (10.0.x) och senare.

-- 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')  
    .AdventureWorks2022.HumanResources.Department (Name, GroupName)  
    VALUES (N'Standards and Methods', 'Quality Assurance');  
GO  

P. Infoga i en extern tabell som skapats med PolyBase

Exportera data från SQL Server till Hadoop eller Azure Storage. Skapa först en extern tabell som pekar på målfilen eller katalogen. Använd sedan INSERT INTO för att exportera data från en lokal SQL Server-tabell till en extern datakälla. INSERT INTO-instruktionen skapar målfilen eller katalogen om den inte finns och resultatet av SELECT-instruktionen exporteras till den angivna platsen i det angivna filformatet. Mer information finns i Komma igång med PolyBase.

Gäller för: SQL Server.

-- 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;  

Massinläsning av data från tabeller eller datafiler

Exempel i det här avsnittet visar två metoder för att massinläsa data i en tabell med hjälp av INSERT-instruktionen.

Q. Infoga data i en heap med minimal loggning

I följande exempel skapas en ny tabell (en heap) och data från en annan tabell infogas i den med minimal loggning. Exemplet förutsätter att databasens återställningsmodell AdventureWorks2022 är inställd på FULL. För att säkerställa att minimal loggning används är databasens återställningsmodell AdventureWorks2022 inställd på BULK_LOGGED innan rader infogas och återställs till FULL efter INSERT INTO... SELECT-instruktion. Dessutom anges TABLOCK-tipset för måltabellen Sales.SalesHistory. Detta säkerställer att instruktionen använder minimalt utrymme i transaktionsloggen och fungerar effektivt.

-- 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 AdventureWorks2022  
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 AdventureWorks2022  
SET RECOVERY FULL;  
GO  

R. Använda funktionen OPENROWSET med BULK för att massinläsa data i en tabell

I följande exempel infogas rader från en datafil i en tabell genom att ange funktionen OPENROWSET. Den IGNORE_TRIGGERS tabelltipset anges för prestandaoptimering. Fler exempel finns i Importera massdata med HJÄLP av BULK INSERT eller OPENROWSET(BULK...) (SQL Server).

gäller för: SQL Server 2008 (10.0.x) och senare.

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 ;  

Åsidosätta standardbeteendet för frågeoptimeraren med hjälp av tips

Exempel i det här avsnittet visar hur du använder tabelltips för att tillfälligt åsidosätta standardbeteendet för frågeoptimeraren när du bearbetar INSERT-instruktionen.

Caution

Eftersom SQL Server-frågeoptimeraren vanligtvis väljer den bästa körningsplanen för en fråga rekommenderar vi att tips endast används som en sista utväg av erfarna utvecklare och databasadministratörer.

S. Använda TABLOCK-tipset för att ange en låsningsmetod

I följande exempel anges att ett exklusivt (X) lås tas i tabellen Production.Location och hålls kvar till slutet av INSERT-instruktionen.

Gäller för: SQL Server, SQL Database.

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

Samla in resultatet av INSERT-instruktionen

Exempel i det här avsnittet visar hur du använder OUTPUT-satsen för att returnera information från, eller uttryck baserat på, varje rad som påverkas av en INSERT-instruktion. Dessa resultat kan returneras till bearbetningsprogrammet för användning i till exempel bekräftelsemeddelanden, arkivering och andra programkrav.

T. Använda UTDATA med en INSERT-instruktion

I följande exempel infogas en rad i ScrapReason tabellen och satsen används OUTPUT för att returnera resultatet av -instruktionen @MyTableVar till tabellvariabeln. ScrapReasonID Eftersom kolumnen definieras med en IDENTITY egenskap anges inget värde i instruktionen för den INSERT kolumnen. Observera dock att värdet som genereras av databasmotorn för kolumnen returneras i OUTPUT -satsen i INSERTED.ScrapReasonID kolumnen.

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. Använda UTDATA med identitets- och beräknade kolumner

I följande exempel skapas tabellen och flera rader infogas i den EmployeeSales med hjälp av en INSERT-instruktion med en SELECT-instruktion för att hämta data från källtabeller. Tabellen EmployeeSales innehåller en identitetskolumn (EmployeeID) och en beräknad kolumn (ProjectedSales). Eftersom dessa värden genereras av databasmotorn under infogningsåtgärden kan ingen av dessa kolumner definieras i @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. Infoga data som returneras från en OUTPUT-sats

I följande exempel avbildas data som returneras från OUTPUT-satsen i en MERGE-instruktion och infogar dessa data i en annan tabell. MERGE-instruktionen Quantity uppdaterar kolumnen i ProductInventory tabellen dagligen, baserat på beställningar som bearbetas i SalesOrderDetail tabellen i databasen AdventureWorks2022. Den tar också bort rader för produkter vars lager sjunker till 0. Exemplet avbildar de rader som tas bort och infogar dem i en annan tabell, ZeroInventory, som spårar produkter utan inventering.

--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. Infoga data med alternativet SELECT

I följande exempel visas hur du infogar flera rader med data med hjälp av en INSERT-instruktion med ett SELECT-alternativ. Den första INSERT instruktionen använder en SELECT instruktion direkt för att hämta data från källtabellen och sedan för att lagra resultatuppsättningen EmployeeTitles i tabellen.

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. Ange en etikett med INSERT-instruktionen

I följande exempel visas användningen av en etikett med en INSERT-instruktion.

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

Y. Använda en etikett och ett frågetips med INSERT-instruktionen

Den här frågan visar den grundläggande syntaxen för att använda en etikett och ett frågekopplingstips med INSERT-instruktionen. När frågan har skickats till kontrollnoden tillämpar SQL Server, som körs på beräkningsnoderna, hashkopplingsstrategin när den genererar SQL Server-frågeplanen. Mer information om kopplingstips och hur du använder OPTION-satsen finns i ALTERNATIV (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);  

See Also

BULK INSERT (Transact-SQL)
DELETE (Transact-SQL)
EXECUTE (Transact-SQL)
FROM (Transact-SQL)
IDENTITY (egenskap) (Transact-SQL)
NEWID (Transact-SQL)
SELECT (Transact-SQL)
UPDATE (Transact-SQL)
MERGE (Transact-SQL)
OUTPUT-sats (Transact-SQL)
Använd de infogade och borttagna tabellerna