INSERT (języka Transact-SQL)

Dodaje nowe wiersze do tabela lub widoku.Aby zapoznać się z przykładami zobacz INSERT Examples (Transact-SQL).

Topic link iconKonwencje składni języka Transact-SQL

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

Argumenty

  • WITH common_table_expression < >
    Określa zestaw tymczasowy o nazwie wynik, znane również jako wspólne wyrażenie tabela, określonych w zakresie instrukcja INSERT.Zestaw wyników jest określany na podstawie instrukcja SELECT.

    Typowe wyrażenia tabela można również z instrukcji SELECT, DELETE, UPDATE i CREATE VIEW.Aby uzyskać więcej informacji zobaczWITH common_table_expression (Transact-SQL).

  • TOP ( expression ) [%]
    Specifies the number or percent of random rows that will be inserted.expression can be either a number or a percent of the rows.Wiersze w TOP wyrażenie, które są używane z INSERT UPDATE, lub DELETE nie są rozmieszczone w dowolnej kolejności.

    Nawiasy ograniczająca expression w TOP są wymagane w instrukcji INSERT, UPDATE i DELETE. Aby uzyskać więcej informacji zobaczTOP (Transact-SQL).

  • DO
    Jest opcjonalne słowa kluczowego, które mogą być używane między INSERT i tabela miejsce docelowe.

  • server_name
    Is the name of the linked server on which the table or view is located.server_name can be specified as a linked server name, or by using the OPENDATASOURCE function.

    Kiedy server_name jest określony jako serwer połączony database_name i schema_name są wymagane. Kiedy server_name jest określany za pomocą OPENDATASOURCE, database_name i schema_name nie może być stosowane do wszystkich źródeł danych i podlega funkcje dostawca OLE DB, który uzyskuje dostęp do obiektu zdalnego. Aby uzyskać więcej informacji zobaczDistributed Queries.

  • database_name
    Jest nazwą bazy danych.

  • schema_name
    To nazwa schematu, do której należy tabela lub widok.

  • table_or view_name
    To nazwa tabela lub widoku, który ma otrzymać dane.

    A Tabela zmienną, w swoim zakresie, można użyć jako urządzenie źródłowe tabeli za pomocą instrukcja INSERT.

    W widoku, do którego odnosi się table_or_view_name musi być możliwa i połącz dokładnie jednej tabela bazowa w klauzula FROM widoku. Na przykład, należy użyć INSERT do wyświetlenia multitable column_list tylko kolumny, która odwołuje się z jednej tabela bazowa. Aby uzyskać więcej informacji na temat widoków można aktualizować zobacz CREATE VIEW języka Transact-SQL).

  • rowset_function_limited
    Czy albo OPENQUERY or OPENROWSET funkcja.Korzystanie z tych funkcji podlega funkcje dostawca OLE DB, który uzyskuje dostęp do obiektu zdalnego.Aby uzyskać więcej informacji zobaczDistributed Queries.

  • WITH (< table_hint_limited >...n )
    Określa wskazówki tabela, które są dozwolone dla tabela miejsce docelowe.Słowo kluczowe WITH i nawiasy są wymagane.

    READPAST, NOLOCK i READUNCOMMITTED nie są dozwolone.Aby uzyskać więcej informacji na temat wskazówek dotyczących tabela zobacz Wskazówki do tabela (języka Transact-SQL).

    Important noteImportant Note:

    Możliwość określenia HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD lub UPDLOCK wskazówki dla tabel, które są celami instrukcji INSERT zostaną usunięte w przyszłej wersja programu SQL Server. Te wskazówki nie mają wpływu na wydajność instrukcji INSERT.Należy unikać stosowania ich w nowej pracy rozwoju i zaplanować do modyfikowania aplikacji, które aktualnie używają ich.

    Określanie TABLOCK wskazówki dla tabela, która jest miejsce docelowe instrukcja INSERT ma ten sam efekt jak określanie wskazówka TABLOCKX.W tabela jest pobierana wyłącznej blokada.

  • ( column_list )
    Is a list of one or more columns in which to insert data.column_list must be enclosed in parentheses and delimited by commas.

    Jeśli nie ma kolumna column_list, Database Engine musi być w stanie dostarczyć wartości na podstawie definicji kolumna; w przeciwnym razie nie można załadować wiersza. The Database Engine automatically provides a value for the kolumna if the kolumna:

    • Zawiera właściwość tożsamości.Następna wartość przyrostowe tożsamości jest używana.

    • Ma wartość domyślną.Używana jest wartość domyślna dla kolumna.

    • Ma timestamp Typ danych. Jest używana aktualna wartość sygnatury czasowej.

    • Jest pustych.Używana jest wartość null.

    • Jest to kolumna obliczana.Obliczona wartość jest używana.

    column_list i listy wartości muszą być używane podczas jawnego wartości są wstawiane do kolumna tożsamości, a opcja IDENTITY_INSERT zestaw musi być ON w tabela.

  • Klauzula wyjście
    Zwraca wstawić wiersze w ramach operacji wstawiania.Wyniki mogą być zwracane do aplikacji przetwarzania lub wstawione do tabela lub zmiennej tabela do dalszego przetwarzania.

    The OUTPUT klauzula 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. Klauzuli INTO wyjście nie jest obsługiwany w instrukcji INSERT, które zawierają <dml_table_source> Klauzula.

  • VALUES
    Wprowadzenie do listy lub listy wartości danych do wstawienia.Musi być jedną wartość danych dla każdej kolumna column_list, jeśli określony lub w tabela. Lista wartości muszą być ujęte w nawiasy.

    Jeżeli wartości na liście wartości nie są w kolejności kolumn w tabela lub nie ma wartości dla każdej kolumna w tabela column_list należy używać jawnie określić kolumna, w której są przechowywane poszczególne wartości przychodzących.

    SQL Server 2008 wprowadzono Transact-SQL wiersz konstruktora (nazywanego również konstruktora wartość tabela) do określenia wielu wierszy w jednej instrukcja INSERT. Konstruktor wierszy składa się z pojedynczej klauzula VALUES z wielu list wartości ujęte w nawiasy i oddzielone przecinkami.Zobacz temat "Wstawianie wielu wierszy za pomocą a pojedynczy INSERT instrukcja" w sekcji Uwagi.

  • WARTOŚĆ DOMYŚLNA
    Wymusza Database Engine Aby załadować wartość domyślną dla kolumna. Jeśli domyślnie nie istnieje dla kolumna, a kolumna dozwolone wartości null, zostanie wstawiony wartości NULL.W wypadku kolumna zdefiniowane przy użyciu timestamp Typ danych jest wstawiany następna wartość sygnatury czasowej. DOMYŚLNY nie jest prawidłowy dla kolumna tożsamości.

  • expression
    Jest stała, zmienna lub wyrażenie.Wyrażenie nie może zawierać instrukcja wykonać.

    Przy odwoływaniu się do typy danych standardu Unicode znaku nchar, nvarchar, a ntext, „wyrażenie"należy poprzedzać prefiksem Wielka litera n".Jeśli 'N' nie zostanie określona, SQL Server Konwertuje ciąg na strona kodowa, która odpowiada domyślnym sortowaniem bazy danych lub kolumna. Tracone są wszystkie znaki, nie można odnaleźć tej strona kodowa.Aby uzyskać więcej informacji zobaczServer-Side Programming with Unicode.

  • derived_table
    Jest ważne instrukcja SELECT, zwracająca wiersze danych, które mają być ładowane do tabela.Instrukcja SELECT nie może zawierać typowe wyrażenie tabela (CTE).

  • execute_statement
    Jest ważne instrukcja wykonać zwraca dane z instrukcja SELECT lub READTEXT.

    Jeśli execute_statement jest używana z INSERT, muszą być zgodne z kolumnami w tabela lub w każdego zestaw wyników column_list.

    execute_statement można używać do wykonywania procedur przechowywanych w tym samym serwerze lub serwerze zdalnym.Wykonywana jest procedura w serwerze zdalnym i zestawy wyników są zwracane do serwera lokalnego i załadowano do tabela w lokalnym serwerze.W przypadku transakcja rozproszona execute_statement Nie można wystawić przed sprzężenia zwrotnego serwer połączony, gdy połączenie ma wiele zestawów wyników aktywne (MARS) włączony.

    If execute_statement returns data with the READTEXT statement, each READTEXT statement can return a maximum of 1 MB (1024 KB) of data.execute_statement can also be used with extended procedures.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.

    Nie można określić parametr wycenione tabela jako miejsce docelowe instrukcja INSERT EXEC, jednak może być określony jako urządzenie źródłowe w ciąg INSERT EXEC lub procedura przechowywana.Aby uzyskać więcej informacji zobaczTabela Valued parametry (aparat bazy danych).

  • <dml_table_source>
    Określa, że wiersze wstawione do tabela miejsce docelowe są tych, które są zwracane przez klauzulę wyjście instrukcja INSERT, UPDATE, DELETE lub korespondencji SERYJNEJ, opcjonalnie filtrowane według klauzula WHERE.Jeśli <dml_table_source> jest określony, miejsce docelowe zewnętrzne instrukcja INSERT musi spełniać następujące ograniczenia:

    • Musi istnieć w tabela bazowa nie w widoku.

    • Nie można go tabela zdalnej.

    • To nie może mieć żadnych wyzwalaczy zdefiniowany na nim.

    • Nie może on uczestniczyć w podstawowego klucz obcy relacji kluczy.

    • Nie może on uczestniczyć w replikacja łączenia lub mogą być aktualizowane subskrypcji dla replikacja transakcyjnej.

    Poziom zgodności bazy danych musi wynosić 100.Aby uzyskać więcej informacji zobacz "Wstawianie danych z klauzula wyjście do tabela miejsce docelowe" w sekcji Uwagi.

  • <select_list>
    Jest rozdzielana przecinkami lista określająca, kolumny, które są zwracane przez klauzula wyjście do wstawienia.The columns in <select_list> must be compatible with the columns into which values are being inserted.<select_list> cannot reference aggregate functions or TEXTPTR.

    Uwaga

    Wszystkie zmienne wymienione na liście SELECT odnoszą się do przywrócenia oryginalnych wartości, niezależnie od zmiany wprowadzone do nich w <dml_statement_with_output_clause>.

  • <dml_statement_with_output_clause>
    Jest ważne instrukcja INSERT, UPDATE, DELETE lub korespondencji SERYJNEJ zwraca wpływa na wiersze w klauzula OUTPUT.Instrukcja nie może zawierać klauzulę WITH i nie można kierować zdalnego tabel lub widoków podzielonym na partycje.Jeżeli określono UPDATE lub DELETE, nie może być aktualizacja programu kursor lub DELETE.Wierszy źródłowych nie można się do niego odwoływać jak zagnieżdżonych instrukcji DML.

  • WHERE < search_condition >
    Czy wszelkie WHERE klauzula zawierający prawidłowy <search_condition> które filtruje wierszy zwracanych przez <dml_statement_with_output_clause>. Aby uzyskać więcej informacji zobaczSearch Condition (Transact-SQL).W tym kontekście <search_condition> nie może zawierać podkwerend, zdefiniowane przez użytkownika funkcji wartość skalarna wykonujące dostępu do danych, funkcje agregujące, TEXTPTR lub predykaty przeszukiwanie pełnego tekstu.

  • WARTOŚCI DOMYŚLNE
    Wymusza nowego wiersza do zawierają wartości domyślne zdefiniowane dla każdej kolumna.

Najważniejsze wskazówki dotyczące zbiorczego ładowania danych

Minimalna rejestrowanie przy użyciu INTO…SELECT INSERT ładowanie zbiorcze danych

Można użyć INSERT INTO <target_table> WYBIERZ OPCJĘ <kolumny> Z <source_table> efektywne transfer dużej liczby wierszy z jednej tabela, na przykład tymczasowej tabela do innej tabela przy minimalnym rejestrowania. Rejestrowanie minimalny może zwiększyć wydajność instrukcja i zmniejszyć ryzyko tego operacja wypełniania miejsca dziennik transakcji dostępny podczas transakcji.

Minimalna rejestrowania dla tej instrukcja ma następujące wymagania:

  • model odzyskiwanie Bazy danych jest ustawiony prostych lub zarejestrowane zbiorczej.

  • Tabela miejsce docelowe to sterty pustych lub niepustych.

  • W tabela miejsce docelowe nie jest używany w replikacja.

  • Wskazówka TABLOCK określono w tabela miejsce docelowe.

Wiersze, które są wstawiane do sterty w wyniku operacji wstawiania w instrukcja korespondencji SERYJNEJ może również zostać minimalny zestaw zarejestrowane.

W odróżnieniu od instrukcja BULK INSERT, które zostały przedstawione w mniej restrykcyjnych blokada aktualizacji zbiorczej, INSERT INTO…SELECT z podpowiedzi TABLOCK przechowuje blokada wyłączności (X) w tabela.Oznacza to, że nie można wstawić wierszy przy użyciu operacji wstawiania równoległych.Aby uzyskać więcej informacji na temat blokady Zobacz Tryby blokada.

Za pomocą OPENROWSET i BULK zbiorczo ładowania danych

Funkcja OPENROWSET może przyjąć następujące wskazówki tabela, zapewniających optymalizację zbiorczego ładowania przy użyciu instrukcja INSERT:

  • Wskazówka TABLOCK można zminimalizować liczbę rekordów dziennika dla operacji wstawiania.Proste lub zarejestrowane zbiorczej musi być ustawiony modelu odzyskiwanie bazy danych i tabela miejsce docelowe nie mogą być używane w replikacja.Aby uzyskać więcej informacji zobaczPrerequisites for Minimal Logging in Bulk Import.

  • Wskazówka IGNORE_CONSTRAINTS tymczasowo wyłączyć sprawdzanie ograniczenia wyboru i klucz obcy.

  • Wskazówka IGNORE_TRIGGERS tymczasowo wyłączyć wykonywania wyzwalacza.

  • Wskazówka KEEPDEFAULTS umożliwia wstawienie wartości domyślnej kolumna tabela, ewentualnie zamiast wartości NULL, gdy rekord danych nie ma wartości kolumna.

  • Wskazówka KEEPIDENTITY umożliwia wartości tożsamości w plik zaimportowane dane, które ma być użyty dla kolumna tożsamości w tabela miejsce docelowe.

Optymalizacje te są podobne do tych, które są dostępne przy użyciu polecenia BULK INSERT.Aby uzyskać więcej informacji zobaczWskazówki do tabela (języka Transact-SQL).

Typy danych

Podczas wstawiania wierszy należy wziąć pod uwagę następujące zachowanie typ danych:

  • Jeśli wartość jest ładowany w kolumnach z char, varchar, lub varbinary Typ danych, uzupełnienie lub obcinania z odstępów (spacji na końcu char i varchar, zerowe dla varbinary) jest określona przez ustawienie zestaw ANSI_PADDING zdefiniowanych dla kolumna podczas tworzenia tabela. Aby uzyskać więcej informacji zobaczSET ANSI_PADDING (Transact-SQL).

    W poniższej tabela przedstawiono działanie domyślne dla zestaw ANSI_PADDING OFF.

    Typ danych

    Operacja domyślna

    char

    Konsola wartość ze spacjami do określonych szerokości kolumna.

    varchar

    Usuwanie końcowych pomieszczenia do ostatniego znaku nie miejsca lub single-space znak ciągi składające się z samych spacji.

    varbinary

    Usuń końcowe zera.

  • Jeśli ciąg pusty ("") jest ładowany do kolumna z varchar lub text Typ danych, operacja domyślna jest załadowanie ciągu znaków o zerowej długości.

  • Wstawianie wartość null w text lub image kolumna nie powoduje utworzenia wskaźnika ważny tekst nie jest preallocate strona tekst 8 KB. Aby uzyskać więcej informacji na temat wstawiania text i image dane, zobacz Using text, ntext, and image Functions.

  • Utworzone za pomocą kolumn uniqueidentifier Magazyn danych typu specjalnie sformatowany 16-bajtowy wartości binarnych. W przeciwieństwie do kolumny tożsamości Database Engine nie generuje automatycznie wartości dla kolumn z uniqueidentifier Typ danych. Podczas operacji wstawiania zmienne z danych typu uniqueidentifier i na stałe w postaci ciągów umieszcza w formularzu xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 znaków, łączniki, w tym przypadku x jest cyfrą szesnastkową w zakresie 0-9 lub a-f) mogą być używane do uniqueidentifier kolumny. Na przykład 6F9619FF-8B86-D011-B42D-00C04FC964FF jest prawidłową wartością uniqueidentifier Zmienna lub kolumna. Użycie NEWID() funkcja uzyskiwania globalnie unikatowy identyfikator (GUID).

Wstawianie wartości do kolumn typ zdefiniowany przez użytkownika

Można wstawić wartości w kolumnach typ zdefiniowany przez użytkownika przez:

  • Podanie wartości typ zdefiniowany przez użytkownika.

  • Podanie wartości w SQL Server Typ danych systemu, tak długo, jak typ zdefiniowany przez użytkownika obsługuje bezpośrednia lub pośrednia konwersję z tego typu. W poniższym przykładzie pokazano, jak wstawić wartość kolumna typ zdefiniowany przez użytkownika Point, konwertując bezpośrednio z ciąg.

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

    Wartość binarna mogą być dostarczane bez wykonywania konwersja jawna, ponieważ wszystkie typy zdefiniowane przez użytkownika są niejawnie zamienne binarnej.Aby uzyskać więcej informacji na temat konwersji i typów zdefiniowanych przez użytkownika Zobacz Wykonywanie operacji na typy zdefiniowane przez użytkownika.

  • Wywołanie funkcja zdefiniowanej przez użytkownika, który zwraca wartość typ zdefiniowany przez użytkownika.W poniższym przykładzie użyto funkcja zdefiniowanej przez użytkownika CreateNewPoint() Aby utworzyć nową wartość typ zdefiniowany przez użytkownika Point i Wstaw wartość do Cities Tabela.

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

Obsługa błędów

Można zaimplementować obsługę dla instrukcja INSERT, określając instrukcję w konstrukcji TRY…CATCH błędów.Aby uzyskać więcej informacji zobaczZa pomocą TRY... CATCH instrukcji języka Transact-SQL.

Jeśli instrukcja INSERT narusza ograniczenie lub reguły lub jest niezgodny z typem danych kolumna równa, instrukcja nie powiedzie się i zwracany jest komunikat o błędzie.

Jeśli INSERT Trwa ładowanie wiele wierszy z SELECT lub wykonać, naruszenia reguły lub ograniczenia, które występuje od wartości ładowania powoduje instrukcja zatrzymanie, a wiersze nie są załadowane.

Po instrukcja INSERT napotka błąd arytmetyczny (przepełnienia, dzielenie przez zero lub błąd domena) zachodzące podczas oceny wyrażenie Database Engine obsługuje te błędy, jak gdyby ARITHABORT zestaw jest ustawiona na ON. Partia jest zatrzymana i zwracany jest komunikat o błędzie.Podczas oceny wyrażenie jeżeli zestaw ARITHABORT i zestaw ANSI_WARNINGS jest wyłączona, jeśli INSERT instrukcja DELETE lub UPDATE wykryje błąd arytmetyczne, przepełnienie, dzielenie przez zero lub błąd domena, SQL Server Wstawia lub aktualizuje wartości NULL. Jeśli kolumna miejsce docelowe nie jest pustych, insert lub aktualizacja akcja zakończy się niepowodzeniem, a użytkownik otrzymuje błąd.Aby uzyskać więcej informacji zobaczBehavior When ARITHABORT and ARITHIGNORE Are Set to ON.

Współdziałanie

Po zdefiniowaniu wyzwalacz Z INSTEAD działań INSERT przed tabela lub widok, wyzwalacz jest wykonywany zamiast instrukcja INSERT.Aby uzyskać więcej informacji o, a nie z wyzwalaczy zobacz CREATE TRIGGER (języka Transact-SQL).

Ograniczenia i ograniczenia

Przy wstawianiu wartości do zdalnego tabel i nie wszystkie wartości dla wszystkich kolumn są określone, należy określić kolumny, do której są określone wartości ma zostać wstawiony.

Ustawienie opcji zestaw ROWCOUNT jest ignorowany w przypadku instrukcji INSERT przed lokalnymi i zdalnymi widoki podzielonym na partycje.Ponadto ta opcja nie jest obsługiwany dla instrukcji INSERT wydanych dla zdalnego tabel.

Important noteImportant Note:

Za pomocą zestaw ROWCOUNT nie będzie miało wpływu na DELETE, INSERT i UPDATE instrukcje w następnej wersji SQL Server. Nie należy użyć instrukcji DELETE, INSERT i UPDATE w nowej pracy rozwoju ROWCOUNT zestaw i chce zmodyfikować aplikacje, które aktualnie go używają.Firma Microsoft zaleca, aby zamiast tego użyć klauzula TOP.

Zachowanie rejestrowania

Instrukcja INSERT zawsze pełni jest rejestrowany z wyjątkiem przypadków, gdy funkcja OPENROWSET ze słowem kluczowym BULK lub podczas korzystania z INSERT INTO <target_table> WYBIERZ OPCJĘ <kolumny> Z <source_table>. Operacje te mogą być rejestrowane minimalny zestaw.Aby uzyskać więcej informacji zobacz sekcję "Najważniejsze wskazówki dla zbiorcze ładowanie danych" we wcześniejszej części tego tematu.

Zabezpieczenia

Podczas połączenia serwer połączony serwer wysyłający zawiera nazwy logowania i hasło, aby połączyć się z serwerem odbierającym w jego imieniu.Dla tego połączenia do pracy należy utworzyć identyfikator logowania mapowania między połączonymi serwerami przy użyciu sp_addlinkedsrvlogin.Aby uzyskać więcej informacji zobaczSecurity for Linked Servers.

Gdy używasz OPENROWSET(BULK…), ważne jest zrozumieć, w jaki sposób SQL Server obsługuje personifikacji. Aby uzyskać więcej informacji zobacz "" zagadnienia dotyczące zabezpieczeń"w Importing Bulk Data by Using BULK INSERT or OPENROWSET(BULK...).

Uprawnienia

W tabela miejsce docelowe, wymagane jest uprawnienie INSERT.

INSERT domyślnych uprawnień dla członków sysadmin ustala rolę serwera db_owner i db_datawriter ról stałej bazy danych i właściciela tabela. Członkowie sysadmin, db_owner, a także db_securityadmin role i właściciela tabela mogą przesyłać uprawnień innym użytkownikom.

Aby za pomocą funkcja OPENROWSET opcji BULK INSERT, musi być członkiem sysadmin Rola serwera stałe lub bulkadmin stała rola serwera.

Przykłady

Aby zapoznać się z przykładami zobacz INSERT Examples (Transact-SQL).