Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Magazyn w usłudze Microsoft Fabric
Baza danych SQL w usłudze Microsoft Fabric (wersja zapoznawcza)
Dodaje jeden lub więcej wierszy do tabeli lub widoku w programie SQL Server. Przykłady można znaleźć w temacie Przykłady.
Transact-SQL konwencje składni
Syntax
Składnia dla programu SQL Server i usługi Azure SQL Database i bazy danych SQL Fabric
-- 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 ]
Składnia dla usług Azure Synapse Analytics i Parallel Data Warehouse i 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
Z <common_table_expression>
Określa tymczasowy nazwany zestaw wyników, znany również jako wspólne wyrażenie tabeli zdefiniowane w zakresie instrukcji INSERT. Zestaw wyników pochodzi z instrukcji SELECT. Aby uzyskać więcej informacji, zobacz WITH common_table_expression (Transact-SQL).
TOP (wyrażenie) [ PERCENT ]
Określa liczbę lub procent losowych wierszy, które zostaną wstawione.
wyrażenie może być liczbą lub procentem wierszy. Aby uzyskać więcej informacji, zobacz TOP (Transact-SQL).
INTO
Jest opcjonalnym słowem kluczowym, którego można użyć między funkcją INSERT i tabelą docelową.
server_name
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.
To nazwa serwera połączonego, na którym znajduje się tabela lub widok. server_name można określić jako nazwę serwera połączonego lub za pomocą funkcji OPENDATASOURCE .
Gdy server_name jest określony jako serwer połączony, wymagane są database_name i schema_name . Po określeniu server_name z funkcją OPENDATASOURCE database_name i schema_name mogą nie mieć zastosowania do wszystkich źródeł danych i podlegają możliwościom dostawcy OLE DB, który uzyskuje dostęp do obiektu zdalnego.
database_name
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.
To nazwa bazy danych.
schema_name
To nazwa schematu, do którego należy tabela lub widok.
table_or view_name
To nazwa tabeli lub widoku, który ma odbierać dane.
Zmienna tabeli w zakresie może służyć jako źródło tabeli w instrukcji INSERT.
Widok, do którego odwołuje się table_or_view_name , musi być aktualizowalny i odwoływać się do dokładnie jednej tabeli podstawowej w klauzuli FROM widoku. Na przykład obiekt INSERT w widoku z wieloma tabelami musi używać column_list odwołującego się tylko do kolumn z jednej tabeli bazowej. Aby uzyskać więcej informacji na temat aktualizowalnych widoków, zobacz CREATE VIEW (Transact-SQL).
rowset_function_limited
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.
Jest funkcją OPENQUERY lub OPENROWSET . Korzystanie z tych funkcji podlega możliwościom dostawcy OLE DB, który uzyskuje dostęp do obiektu zdalnego.
WITH ( <table_hint_limited> [... n ] )
Określa co najmniej jedną wskazówkę tabeli dozwoloną dla tabeli docelowej. Słowo kluczowe WITH i nawiasy są wymagane.
READPAST, NOLOCK i READUNCOMMITTED są niedozwolone. Aby uzyskać więcej informacji na temat wskazówek dotyczących tabel, zobacz Wskazówki dotyczące tabel (Transact-SQL).
Important
Możliwość określenia wskazówek HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD lub UPDLOCK w tabelach, które są elementami docelowymi instrukcji INSERT, zostaną usunięte w przyszłej wersji programu SQL Server. Te wskazówki nie wpływają na wydajność instrukcji INSERT. Unikaj używania ich w nowych pracach programistycznych i zaplanuj modyfikowanie aplikacji, które obecnie ich używają.
Określenie wskazówki TABLOCK w tabeli, która jest celem instrukcji INSERT, ma taki sam wpływ, jak określenie wskazówki TABLOCKX. Na stole jest pobierana blokada na wyłączność.
(column_list)
Jest listą co najmniej jednej kolumny, w której należy wstawić dane.
column_list muszą być ujęte w nawiasy i rozdzielane przecinkami.
Jeśli kolumna nie znajduje się w column_list, aparat bazy danych musi mieć możliwość podania wartości na podstawie definicji kolumny; w przeciwnym razie nie można załadować wiersza. Aparat bazy danych automatycznie udostępnia wartość dla kolumny, jeśli kolumna:
Ma właściwość IDENTITY. Zostanie użyta kolejna wartość tożsamości przyrostowej.
Ma wartość domyślną. Używana jest wartość domyślna kolumny.
Zawiera typ danych sygnatury czasowej . Używana jest bieżąca wartość znacznika czasu.
Is nullable. Jest używana wartość null.
Jest obliczaną kolumną. Używana jest wartość obliczeniowa.
column_list należy użyć, gdy jawne wartości są wstawione do kolumny tożsamości, a opcja SET IDENTITY_INSERT musi być włączona dla tabeli.
OUTPUT Clause
Zwraca wstawione wiersze w ramach operacji wstawiania. Wyniki można zwrócić do aplikacji przetwarzania lub wstawić do tabeli lub zmiennej tabeli w celu dalszego przetwarzania.
Klauzula OUTPUT nie jest obsługiwana w instrukcjach DML odwołujących się do lokalnych widoków partycjonowanych, rozproszonych widoków partycjonowanych lub tabel zdalnych ani instrukcji INSERT zawierających execute_statement. Klauzula OUTPUT INTO nie jest obsługiwana w instrukcjach INSERT, które zawierają klauzulę <dml_table_source> . Aby uzyskać więcej informacji na temat argumentów i zachowania tej klauzuli, zobacz OUTPUT Clause (Transact-SQL).
VALUES
Wprowadza listę lub listy wartości danych do wstawienia. W column_list musi istnieć jedna wartość danych dla każdej kolumny, jeśli została określona lub w tabeli. Lista wartości musi być ujęta w nawiasy.
Jeśli wartości na liście Wartość nie są w tej samej kolejności co kolumny w tabeli lub nie mają wartości dla każdej kolumny w tabeli, column_list należy użyć do jawnego określenia kolumny, która przechowuje każdą wartość przychodzącą.
Można użyć konstruktora wiersza Transact-SQL (nazywanego również konstruktorem wartości tabeli), aby określić wiele wierszy w jednej instrukcji INSERT. Konstruktor wiersza składa się z pojedynczej klauzuli VALUES z wieloma listami wartości ujętymi w nawiasy i oddzielonymi przecinkami. Aby uzyskać więcej informacji, zobacz Konstruktor wartości tabeli (Transact-SQL).
Note
Konstruktor wartości tabeli nie jest obsługiwany w usłudze Azure Synapse Analytics. Zamiast tego można wykonać kolejne INSERT
instrukcje, aby wstawić wiele wierszy. W usłudze Azure Synapse Analytics wstawiania wartości mogą być tylko stałymi wartościami literału lub odwołaniami do zmiennych. Aby wstawić literał, ustaw zmienną na wartość inną niż stała i wstaw zmienną.
DEFAULT
Wymusza obciążenie aparatu bazy danych wartością domyślną zdefiniowaną dla kolumny. Jeśli dla kolumny nie istnieje wartość domyślna, a kolumna zezwala na wartości null, zostanie wstawiona wartość NULL. Dla kolumny zdefiniowanej z typem danych znacznika czasu zostanie wstawiona wartość znacznika czasu. Wartość DEFAULT jest nieprawidłowa dla kolumny tożsamości.
expression
Jest stałą, zmienną lub wyrażeniem. Wyrażenie nie może zawierać instrukcji EXECUTE.
W przypadku odwoływania się do typów danych znaków Unicode nchar, nvarchar i ntextwyrażenie powinno być poprzedzone literą wielkiej litery "N". Jeśli parametr "N" nie zostanie określony, program SQL Server konwertuje ciąg na stronę kodową odpowiadającą domyślnemu sortowaniu bazy danych lub kolumny. Wszystkie znaki nie odnalezione na tej stronie kodowej zostaną utracone.
derived_table
Czy dowolna prawidłowa instrukcja SELECT zwracająca wiersze danych do załadowania do tabeli. Instrukcja SELECT nie może zawierać wspólnego wyrażenia tabeli (CTE).
execute_statement
Czy dowolna prawidłowa instrukcja EXECUTE zwracająca dane z instrukcjami SELECT lub READTEXT. Aby uzyskać więcej informacji, zobacz EXECUTE (Transact-SQL).
Nie można określić opcji ZESTAWÓW WYNIKÓW instrukcji EXECUTE w wstawce... EXEC, instrukcja.
Jeśli execute_statement jest używana z funkcją INSERT, każdy zestaw wyników musi być zgodny z kolumnami w tabeli lub w column_list.
execute_statement może służyć do wykonywania procedur składowanych na tym samym serwerze lub serwerze zdalnym. Procedura na serwerze zdalnym jest wykonywana, a zestawy wyników są zwracane do serwera lokalnego i ładowane do tabeli na serwerze lokalnym. W transakcji rozproszonej nie można wydać execute_statement względem serwera połączonego sprzężenia zwrotnego, gdy połączenie ma włączone wiele aktywnych zestawów wyników (MARS).
Jeśli execute_statement zwraca dane z instrukcją READTEXT, każda instrukcja READTEXT może zwrócić maksymalnie 1 MB (1024 KB) danych. execute_statement można również używać z rozszerzonymi procedurami. execute_statement wstawia dane zwracane przez główny wątek procedury rozszerzonej; jednak dane wyjściowe z wątków innych niż główny wątek nie są wstawiane.
Nie można określić parametru wartości tabeli jako obiektu docelowego instrukcji INSERT EXEC; można go jednak określić jako źródło w ciągu INSERT EXEC lub procedurze składowanej. Aby uzyskać więcej informacji, zobacz Używanie parametrów Table-Valued (aparat bazy danych).
<dml_table_source>
Określa, że wiersze wstawione do tabeli docelowej są zwracane przez klauzulę OUTPUT instrukcji INSERT, UPDATE, DELETE lub MERGE, opcjonalnie filtrowane według klauzuli WHERE. Jeśli <określono dml_table_source> , element docelowy zewnętrznej instrukcji INSERT musi spełniać następujące ograniczenia:
Musi to być tabela podstawowa, a nie widok.
Nie może to być tabela zdalna.
Nie może mieć żadnych wyzwalaczy zdefiniowanych na nim.
Nie może uczestniczyć w żadnych relacjach klucza podstawowego klucza obcego.
Nie może uczestniczyć w replikacji scalania ani aktualizowalnych subskrypcji na potrzeby replikacji transakcyjnej.
Poziom zgodności bazy danych musi być ustawiony na 100 lub wyższy. Aby uzyskać więcej informacji, zobacz OUTPUT Clause (Transact-SQL).
<select_list>
Jest rozdzielaną przecinkami listą określającą kolumny zwracane przez klauzulę OUTPUT do wstawienia. Kolumny w <select_list> muszą być zgodne z kolumnami, do których są wstawiane wartości.
<
> select_list nie może odwoływać się do funkcji agregujących ani textPTR.
Note
Wszystkie zmienne wymienione na liście SELECT odwołują się do ich oryginalnych wartości, niezależnie od wszelkich zmian wprowadzonych w <dml_statement_with_output_clause>.
<dml_statement_with_output_clause>
Jest prawidłową instrukcją INSERT, UPDATE, DELETE lub MERGE, która zwraca dotknięte wiersze w klauzuli OUTPUT. Instrukcja nie może zawierać klauzuli WITH i nie może kierować tabel zdalnych ani partycjonowanych widoków. Jeśli określono wartość UPDATE lub DELETE, nie może to być aktualizacja ani usuwanie oparte na kursorach. Nie można odwoływać się do wierszy źródłowych jako zagnieżdżonych instrukcji DML.
GDZIE <search_condition>
Czy dowolna klauzula WHERE zawiera prawidłową <search_condition> , która filtruje wiersze zwracane przez <dml_statement_with_output_clause>. Aby uzyskać więcej informacji, zobacz Warunek wyszukiwania (Transact-SQL). W przypadku użycia w tym kontekście <search_condition> nie może zawierać podzapytania, funkcji zdefiniowanych przez użytkownika skalarnych, które wykonują dostęp do danych, funkcje agregujące, TEXTPTR lub predykaty wyszukiwania pełnotekstowego.
DEFAULT VALUES
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.
Wymusza, aby nowy wiersz zawierał wartości domyślne zdefiniowane dla każdej kolumny.
BULK
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.
Używane przez narzędzia zewnętrzne do przekazywania strumienia danych binarnych. Ta opcja nie jest przeznaczona do użycia z narzędziami, takimi jak SQL Server Management Studio, SQLCMD, OSQL lub interfejsy programowania aplikacji dostępu do danych, takie jak SQL Server Native Client.
FIRE_TRIGGERS
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.
Określa, że wszystkie wyzwalacze wstawiania zdefiniowane w tabeli docelowej są wykonywane podczas operacji przekazywania strumienia danych binarnych. Aby uzyskać więcej informacji, zobacz BULK INSERT (Transact-SQL).
CHECK_CONSTRAINTS
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.
Określa, że wszystkie ograniczenia tabeli docelowej lub widoku muszą być sprawdzane podczas operacji przekazywania strumienia danych binarnych. Aby uzyskać więcej informacji, zobacz BULK INSERT (Transact-SQL).
KEEPNULLS
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.
Określa, że puste kolumny powinny zachować wartość null podczas operacji przekazywania strumienia danych binarnych. Aby uzyskać więcej informacji, zobacz Zachowaj wartości null lub Użyj wartości domyślnych podczas importowania zbiorczego (SQL Server).
KILOBYTES_PER_BATCH = kilobytes_per_batch
Określa przybliżoną liczbę kilobajtów (KB) danych na partię jako kilobytes_per_batch. Aby uzyskać więcej informacji, zobacz BULK INSERT (Transact-SQL).
ROWS_PER_BATCH =rows_per_batch
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.
Wskazuje przybliżoną liczbę wierszy danych w strumieniu danych binarnych. Aby uzyskać więcej informacji, zobacz BULK INSERT (Transact-SQL).
Note
Jeśli nie podano listy kolumn, zostanie zgłoszony błąd składni.
Remarks
Aby uzyskać informacje specyficzne dla wstawiania danych do tabel grafów SQL, zobacz INSERT (SQL Graph).
Best Practices
Użyj funkcji @@ROWCOUNT, aby zwrócić liczbę wstawionych wierszy do aplikacji klienckiej. Aby uzyskać więcej informacji, zobacz @@ROWCOUNT (Transact-SQL).
Najlepsze rozwiązania dotyczące zbiorczego importowania danych
Za pomocą funkcji INSERT INTO... WYBIERANIE do zbiorczego importowania danych przy minimalnym rejestrowaniu i równoległości
Można użyć INSERT INTO <target_table> SELECT <columns> FROM <source_table>
do wydajnego transferu dużej liczby wierszy z jednej tabeli, takiej jak tabela przejściowa, do innej tabeli z minimalnym rejestrowaniem. Minimalne rejestrowanie może poprawić wydajność instrukcji i zmniejszyć możliwość wykonania operacji wypełniania dostępnej przestrzeni dziennika transakcji podczas transakcji.
Minimalne rejestrowanie dla tej instrukcji ma następujące wymagania:
- Model odzyskiwania bazy danych jest ustawiony na prosty lub rejestrowany zbiorczo.
- Tabela docelowa jest pustą lub niepustą stertą.
- Tabela docelowa nie jest używana w replikacji.
- Wskazówka jest określona
TABLOCK
dla tabeli docelowej.
Wiersze wstawione do sterta w wyniku akcji wstawiania w instrukcji MERGE mogą być również rejestrowane minimalnie.
BULK INSERT
W przeciwieństwie do instrukcji, która zawiera mniej restrykcyjną blokadę aktualizacji zbiorczej (BU), INSERT INTO … SELECT
z TABLOCK
wskazówką zawiera wyłączną blokadę (X) w tabeli. Oznacza to, że nie można wstawić wierszy przy użyciu wielu operacji wstawiania wykonywanych jednocześnie.
Jednak począwszy od programu SQL Server 2016 (13.x) i poziomu zgodności bazy danych 130, można wykonać pojedynczą INSERT INTO … SELECT
instrukcję równolegle podczas wstawiania do sterty lub klastrowanych indeksów magazynu kolumn (CCI). Wstawianie równoległe jest możliwe w przypadku korzystania z TABLOCK
wskazówki.
Równoległość powyższej instrukcji ma następujące wymagania, które są podobne do wymagań dotyczących minimalnego rejestrowania:
- Tabela docelowa jest pustą lub niepustą stertą.
- Tabela docelowa ma indeks klastrowanego magazynu kolumn (CCI), ale nie ma indeksów nieklarowanych.
- Tabela docelowa nie ma kolumny tożsamości z IDENTITY_INSERT ustawioną na wartość OFF.
- Wskazówka jest określona
TABLOCK
dla tabeli docelowej.
W przypadku scenariuszy, w których są spełnione wymagania dotyczące minimalnego rejestrowania i wstawiania równoległego, obie ulepszenia będą działać razem, aby zapewnić maksymalną przepływność operacji ładowania danych.
Aby uzyskać więcej informacji na temat używania funkcji INSERT w magazynie w usłudze Microsoft Fabric, zobacz Pozyskiwanie danych do magazynu przy użyciu języka Transact-SQL.
Note
Funkcja wstawiania do lokalnych tabel tymczasowych (zidentyfikowanych przez prefiks #) oraz globalnych tabel tymczasowych (zidentyfikowanych przez prefiksy ##) jest również włączona dla równoległego przetwarzania przy użyciu wskazówki TABLOCK.
Używanie funkcji OPENROWSET i BULK do zbiorczego importowania danych
Funkcja OPENROWSET może akceptować następujące wskazówki tabeli, które zapewniają optymalizacje obciążenia zbiorczego za pomocą instrukcji INSERT:
- Wskazówka
TABLOCK
może zminimalizować liczbę rekordów dziennika dla operacji wstawiania. Model odzyskiwania bazy danych musi być ustawiony na prosty lub rejestrowany zbiorczo, a tabela docelowa nie może być używana w replikacji. Aby uzyskać więcej informacji, zobacz Wymagania wstępne dotyczące minimalnego rejestrowania w importowaniu zbiorczym. - Wskazówka
TABLOCK
może włączyć operacje wstawiania równoległego. Tabela docelowa jest stosem lub klastrowanym indeksem magazynu kolumn (CCI) bez indeksów nieklarowanych, a tabela docelowa nie może mieć określonej kolumny tożsamości. - Wskazówka
IGNORE_CONSTRAINTS
może tymczasowo wyłączyć sprawdzanie ograniczeń KLUCZ OBCY i CHECK. - Wskazówka
IGNORE_TRIGGERS
może tymczasowo wyłączyć wykonywanie wyzwalacza. - Wskazówka
KEEPDEFAULTS
umożliwia wstawienie wartości domyślnej kolumny tabeli, jeśli istnieje, zamiast wartości NULL, gdy rekord danych nie ma wartości dla kolumny. - Wskazówka
KEEPIDENTITY
umożliwia użycie wartości tożsamości w zaimportowanych plikach danych dla kolumny tożsamości w tabeli docelowej.
Te optymalizacje są podobne do tych dostępnych za BULK INSERT
pomocą polecenia . Aby uzyskać więcej informacji, zobacz Wskazówki dotyczące tabel (Transact-SQL).
Data Types
Podczas wstawiania wierszy należy wziąć pod uwagę następujące zachowanie typu danych:
Jeśli wartość jest ładowana do kolumn z typem danych char, varchar lub varbinary , wypełnienie lub obcinanie końcowych wartości pustych (spacje dla znaków i varchar, zera dla zmiennej varbinary) jest określane przez ustawienie SET ANSI_PADDING zdefiniowane dla kolumny podczas tworzenia tabeli. Aby uzyskać więcej informacji, zobacz SET ANSI_PADDING (Transact-SQL).
W poniższej tabeli przedstawiono domyślną operację SET ANSI_PADDING OFF.
Data type Default operation char Dopełnij wartość spacjami do zdefiniowanej szerokości kolumny. varchar Usuń spacje końcowe do ostatniego znaku innego niż spacja lub do znaku z jedną spacją dla ciągów składających się tylko z spacji. varbinary Usuń końcowe zera. Jeśli pusty ciąg (" ") jest ładowany do kolumny z typem danych varchar lub text , domyślną operacją jest załadowanie ciągu o zerowej długości.
Wstawianie wartości null do kolumny tekstowej lub obrazu nie powoduje utworzenia prawidłowego wskaźnika tekstowego ani wstępnego przydzielenia strony tekstowej o rozmiarze 8 KB.
Kolumny utworzone za pomocą unikatowego magazynu typów danychidentifier specjalnie sformatowane 16-bajtowe wartości binarne. W przeciwieństwie do kolumn tożsamości aparat bazy danych nie generuje automatycznie wartości dla kolumn z unikatowym typem danychidentifier . Podczas operacji wstawiania zmienne z typem danych uniqueidentifier i stałe ciągów w postaci xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ( 36 znaków, w tym łączniki, gdzie x jest cyfrą szesnastkową w zakresie 0-9 lub f) mogą być używane dla kolumn unikatowychidentifier . Na przykład 6F9619FF-8B86-D011-B42D-00C04FC964FF jest prawidłową wartością dla unikatowej zmiennej lub kolumny. Użyj funkcji NEWID(), aby uzyskać unikatowy identyfikator globalny (GUID).
Wstawianie wartości do kolumn typu User-Defined
Wartości można wstawiać w kolumnach typu zdefiniowanych przez użytkownika, wykonując następujące czynności:
Podawanie wartości typu zdefiniowanego przez użytkownika.
Podanie wartości w typie danych systemowych programu SQL Server, o ile typ zdefiniowany przez użytkownika obsługuje niejawną lub jawną konwersję z tego typu. W poniższym przykładzie pokazano, jak wstawić wartość w kolumnie typu
Point
zdefiniowanego przez użytkownika, jawnie konwertując wartość z ciągu.INSERT INTO Cities (Location) VALUES ( CONVERT(Point, '12.3:46.2') );
Można również podać wartość binarną bez przeprowadzania jawnej konwersji, ponieważ wszystkie typy zdefiniowane przez użytkownika są niejawnie konwertowane z pliku binarnego.
Wywoływanie funkcji zdefiniowanej przez użytkownika, która zwraca wartość typu zdefiniowanego przez użytkownika. W poniższym przykładzie użyto funkcji
CreateNewPoint()
zdefiniowanej przez użytkownika, aby utworzyć nową wartość typuPoint
zdefiniowanego przez użytkownika i wstawić wartość doCities
tabeli.INSERT INTO Cities (Location) VALUES ( dbo.CreateNewPoint(x, y) );
Error Handling
Obsługę błędów dla instrukcji INSERT można zaimplementować, określając instrukcję w try... Catch.
Jeśli instrukcja INSERT narusza ograniczenie lub regułę lub jeśli ma wartość niezgodną z typem danych kolumny, instrukcja kończy się niepowodzeniem i zwracany jest komunikat o błędzie.
Jeśli funkcja INSERT ładuje wiele wierszy za pomocą polecenia SELECT lub EXECUTE, każde naruszenie reguły lub ograniczenia, które występuje z ładowanych wartości, powoduje zatrzymanie instrukcji i nie są ładowane żadne wiersze.
Gdy instrukcja INSERT napotka błąd arytmetyczny (przepełnienie, dzielenie przez zero lub błąd domeny) występujący podczas obliczania wyrażenia, aparat bazy danych obsługuje te błędy tak, jakby ustawiono ustawienie SET ARITHABORT na wartość ON. Partia zostanie zatrzymana i zostanie zwrócony komunikat o błędzie. Podczas obliczania wyrażenia, gdy set ARITHABORT i SET ANSI_WARNINGS są WYŁĄCZONE, jeśli instrukcja INSERT, DELETE lub UPDATE napotka błąd arytmetyczny, przepełnienie, podział przez zero lub błąd domeny, program SQL Server wstawia lub aktualizuje wartość NULL. Jeśli kolumna docelowa nie jest dopuszczana do wartości null, akcja wstawiania lub aktualizacji kończy się niepowodzeniem, a użytkownik otrzymuje błąd.
Interoperability
INSTEAD OF
Gdy wyzwalacz jest zdefiniowany w akcjach INSERT względem tabeli lub widoku, wyzwalacz jest wykonywany zamiast instrukcji INSERT. Aby uzyskać więcej informacji na temat INSTEAD OF
wyzwalaczy, zobacz CREATE TRIGGER (Transact-SQL).
Ograniczenia i ograniczenia
W przypadku wstawiania wartości do tabel zdalnych, a nie wszystkich wartości dla wszystkich kolumn, należy zidentyfikować kolumny, do których mają zostać wstawione określone wartości.
Jeśli funkcja TOP jest używana z instrukcjami INSERT, do których odwołuje się wiersze, nie są rozmieszczane w żadnej kolejności, a klauzula ORDER BY nie może być określona bezpośrednio w tych instrukcjach. Jeśli musisz użyć funkcji TOP, aby wstawić wiersze w znaczącej kolejności chronologicznej, musisz użyć klauzuli TOP wraz z klauzulą ORDER BY określoną w instrukcji podwybierz. Zobacz sekcję Przykłady w tym temacie.
Zapytania INSERT używające polecenia SELECT z instrukcją ORDER BY do wypełniania wierszy gwarantują sposób obliczania wartości tożsamości, ale nie kolejność wstawiania wierszy.
W usłudze Parallel Data Warehouse klauzula ORDER BY jest nieprawidłowa w funkcjach VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, wbudowanych funkcjach, tabelach pochodnych, podzapytach i typowych wyrażeniach tabeli, chyba że określono również opcję TOP.
Logging Behavior
Instrukcja INSERT jest zawsze w pełni rejestrowana z wyjątkiem używania funkcji OPENROWSET z słowem kluczowym BULK lub w przypadku używania polecenia INSERT INTO <target_table> SELECT <columns> FROM <source_table>
. Te operacje można rejestrować minimalnie. Aby uzyskać więcej informacji, zobacz sekcję "Najlepsze rozwiązania dotyczące zbiorczego ładowania danych" we wcześniejszej części tego tematu.
Zabezpieczenia
Podczas połączenia serwera połączonego serwer wysyła nazwę logowania i hasło umożliwiające nawiązanie połączenia z serwerem odbierający w jego imieniu. Aby to połączenie działało, należy utworzyć mapowanie logowania między serwerami połączonymi przy użyciu sp_addlinkedsrvlogin.
W przypadku korzystania z funkcji OPENROWSET(BULK...) ważne jest, aby zrozumieć, jak program SQL Server obsługuje personifikację. Aby uzyskać więcej informacji, zobacz "Zagadnienia dotyczące zabezpieczeń" w temacie Importowanie danych zbiorczych przy użyciu funkcji BULK INSERT lub OPENROWSET(BULK...) (SQL Server).
Permissions
Uprawnienie INSERT jest wymagane w tabeli docelowej.
Uprawnienia INSERT są domyślne dla członków stałej sysadmin
roli serwera, db_owner
ról i db_datawriter
stałej bazy danych oraz właściciela tabeli.
sysadmin
Członkowie ról , db_owner
i db_securityadmin
oraz właściciel tabeli mogą przenosić uprawnienia do innych użytkowników.
Aby wykonać operację INSERT z opcją BULK funkcji OPENROWSET, musisz być członkiem sysadmin
stałej roli serwera lub stałej bulkadmin
roli serwera.
Examples
Category | Polecane elementy składni |
---|---|
Basic syntax | INSERT * konstruktor wartości tabeli |
Obsługa wartości kolumn | IDENTITY * NEWID * wartości domyślne * typy zdefiniowane przez użytkownika |
Wstawianie danych z innych tabel | WSTAWIAĆ... WYBIERZ * WSTAW... EXECUTE * WITH common table expression * TOP * OFFSET FETCH |
Określanie obiektów docelowych innych niż standardowe tabele | Widoki * zmienne tabeli |
Wstawianie wierszy do tabeli zdalnej | Połączony serwer * funkcja zestawu wierszy OPENQUERY * funkcja zestawu wierszy OPENDATASOURCE |
Zbiorcze ładowanie danych z tabel lub plików danych | WSTAWIAĆ... SELECT * OPENROWSET, funkcja |
Zastępowanie domyślnego zachowania optymalizatora zapytań przy użyciu wskazówek | Table hints |
Przechwytywanie wyników instrukcji INSERT | OUTPUT clause |
Basic Syntax
Przykłady w tej sekcji przedstawiają podstawowe funkcje instrukcji INSERT przy użyciu minimalnej wymaganej składni.
A. Wstawianie pojedynczego wiersza danych
Poniższy przykład wstawia jeden wiersz do Production.UnitMeasure
tabeli w bazie danych AdventureWorks2022. Kolumny w tej tabeli to UnitMeasureCode
, Name
i ModifiedDate
. Ponieważ podano wartości dla wszystkich kolumn i są wymienione w tej samej kolejności co kolumny w tabeli, nazwy kolumn nie muszą być określone na liście kolumn*.*
INSERT INTO Production.UnitMeasure
VALUES (N'FT', N'Feet', '20080414');
B. Wstawianie wielu wierszy danych
W poniższym przykładzie użyto konstruktora wartości tabeli , aby wstawić trzy wiersze do Production.UnitMeasure
tabeli w bazie danych AdventureWorks2022 w pojedynczej instrukcji INSERT. Ponieważ podano wartości dla wszystkich kolumn i są wymienione w tej samej kolejności co kolumny w tabeli, nazwy kolumn nie muszą być określone na liście kolumn.
Note
Konstruktor wartości tabeli nie jest obsługiwany w usłudze 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. Wstawianie danych, które nie są w tej samej kolejności co kolumny tabeli
W poniższym przykładzie użyto listy kolumn, aby jawnie określić wartości wstawione do każdej kolumny. Kolejność kolumn w Production.UnitMeasure
tabeli w bazie danych AdventureWorks2022 to UnitMeasureCode
, Name
, ModifiedDate
ale kolumny nie są wymienione w tej kolejności w column_list.
INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,
ModifiedDate)
VALUES (N'Square Yards', N'Y2', GETDATE());
Obsługa wartości kolumn
Przykłady w tej sekcji przedstawiają metody wstawiania wartości do kolumn zdefiniowanych za pomocą właściwości IDENTITY, wartości DEFAULT lub są definiowane z typami danych, takimi jak unikatoweidentifier lub kolumny typu zdefiniowane przez użytkownika.
D. Wstawianie danych do tabeli z kolumnami, które mają wartości domyślne
W poniższym przykładzie pokazano wstawianie wierszy do tabeli z kolumnami, które automatycznie generują wartość lub mają wartość domyślną.
Column_1
to obliczona kolumna, która automatycznie generuje wartość, łącząc ciąg z wartością wstawioną do column_2
elementu .
Column_2
jest definiowany z domyślnym ograniczeniem. Jeśli dla tej kolumny nie określono wartości, zostanie użyta wartość domyślna.
Column_3
element jest definiowany przy użyciu typu danych rowversion , który automatycznie generuje unikatowy, przyrostowy numer binarny.
Column_4
nie generuje automatycznie wartości. Jeśli nie określono wartości dla tej kolumny, zostanie wstawiona wartość NULL. Instrukcje INSERT wstawią wiersze zawierające wartości dla niektórych kolumn, ale nie wszystkie. W ostatniej instrukcji INSERT nie określono żadnych kolumn i tylko wartości domyślne są wstawiane przy użyciu klauzuli DEFAULT VALUES.
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. Wstawianie danych do tabeli z kolumną tożsamości
W poniższym przykładzie przedstawiono różne metody wstawiania danych do kolumny tożsamości. Pierwsze dwie instrukcje INSERT umożliwiają generowanie wartości tożsamości dla nowych wierszy. Trzecia instrukcja INSERT zastępuje właściwość IDENTITY dla kolumny za pomocą instrukcji SET IDENTITY_INSERT i wstawia jawną wartość do kolumny tożsamości.
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. Wstawianie danych do kolumny uniqueidentifier przy użyciu polecenia NEWID()
W poniższym przykładzie użyto funkcji NEWID() w celu uzyskania identyfikatora GUID dla elementu column_2
. W przeciwieństwie do kolumn tożsamości aparat bazy danych nie generuje automatycznie wartości dla kolumn z unikatowym typem danychidentifier , jak pokazano w drugiej INSERT
instrukcji.
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. Wstawianie danych do kolumn typu zdefiniowanego przez użytkownika
Poniższe instrukcje Transact-SQL wstawiają trzy wiersze do PointValue
kolumny Points
tabeli. Ta kolumna używa typu zdefiniowanego przez użytkownika środowiska CLR (UDT). Typ danych Point
składa się z wartości X i Y całkowitych, które są uwidocznione jako właściwości udT. Musisz użyć funkcji CAST lub CONVERT, aby rzutować wartości rozdzielane przecinkami X i Y na Point
typ. Pierwsze dwie instrukcje używają funkcji CONVERT, aby przekonwertować wartość ciągu na Point
typ, a trzecia instrukcja używa funkcji CAST. Aby uzyskać więcej informacji, zobacz Manipulowanie danymi UDT.
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));
Wstawianie danych z innych tabel
Przykłady w tej sekcji przedstawiają metody wstawiania wierszy z jednej tabeli do innej tabeli.
H. Używanie opcji SELECT i EXECUTE w celu wstawiania danych z innych tabel
W poniższym przykładzie pokazano, jak wstawić dane z jednej tabeli do innej tabeli przy użyciu funkcji INSERT... WYBIERZ lub WSTAW... WYKONAĆ. Każda z nich jest oparta na instrukcji SELECT z wieloma tabelami, która zawiera wyrażenie i wartość literału na liście kolumn.
Pierwsza instrukcja INSERT używa instrukcji SELECT, aby uzyskać dane z tabel źródłowych (Employee
, SalesPerson
i Person
) w bazie danych AdventureWorks2022 i zapisać zestaw wyników w EmployeeSales
tabeli. Druga instrukcja INSERT używa klauzuli EXECUTE, aby wywołać procedurę składowaną zawierającą instrukcję SELECT, a trzecia instrukcja INSERT używa klauzuli EXECUTE, aby odwołać się do instrukcji SELECT jako ciągu literału.
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. Używanie wspólnego wyrażenia tabeli WITH do definiowania wstawionych danych
Poniższy przykład tworzy tabelę NewEmployee
w bazie danych AdventureWorks2022. Wspólne wyrażenie tabeli (EmployeeTemp
) definiuje wiersze z co najmniej jednej tabeli do wstawienia do NewEmployee
tabeli. Instrukcja INSERT odwołuje się do kolumn w typowym wyrażeniu tabeli.
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. Używanie funkcji TOP w celu ograniczenia danych wstawionych z tabeli źródłowej
W poniższym przykładzie utworzono tabelę EmployeeSales
i wstawiono nazwę i dane sprzedaży od początku roku dla 5 najlepszych losowych pracowników z tabeli HumanResources.Employee
w bazie danych AdventureWorks2022. Instrukcja INSERT wybiera wszystkie 5 wierszy zwracanych przez instrukcję SELECT
. Klauzula OUTPUT wyświetla wiersze wstawione do EmployeeSales
tabeli. Zwróć uwagę, że klauzula ORDER BY w instrukcji SELECT nie jest używana do określania 5 pierwszych pracowników.
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;
Jeśli musisz użyć funkcji TOP, aby wstawić wiersze w znaczącej kolejności chronologicznej, musisz użyć funkcji TOP wraz z instrukcją ORDER BY w instrukcji subselect, jak pokazano w poniższym przykładzie. Klauzula OUTPUT wyświetla wiersze wstawione do EmployeeSales
tabeli. Zwróć uwagę, że 5 najlepszych pracowników jest teraz wstawionych na podstawie wyników klauzuli ORDER BY zamiast losowych wierszy.
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;
Określanie obiektów docelowych innych niż standardowe tabele
Przykłady w tej sekcji pokazują, jak wstawić wiersze, określając widok lub zmienną tabeli.
K. Wstawianie danych przez określenie widoku
Poniższy przykład określa nazwę widoku jako obiekt docelowy; jednak nowy wiersz jest wstawiany do bazowej tabeli bazowej. Kolejność wartości w INSERT
instrukcji musi być zgodna z kolejnością kolumn widoku. Aby uzyskać więcej informacji, zobacz Modyfikowanie danych za pośrednictwem widoku.
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. Wstawianie danych do zmiennej tabeli
Poniższy przykład określa zmienną tabeli jako obiekt docelowy w bazie danych 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
Wstawianie wierszy do tabeli zdalnej
Przykłady w tej sekcji pokazują, jak wstawić wiersze do zdalnej tabeli docelowej przy użyciu serwera połączonego lub funkcji zestawu wierszy w celu odwołania się do tabeli zdalnej.
M. Wstawianie danych do tabeli zdalnej przy użyciu serwera połączonego
Poniższy przykład wstawia wiersze do tabeli zdalnej. Przykład rozpoczyna się od utworzenia linku do zdalnego źródła danych przy użyciu sp_addlinkedserver. Nazwa serwera MyLinkServer
połączonego , jest następnie określona jako część nazwy obiektu czteroczęściowego w obiekcie formularza server.catalog.schema.object.
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.
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. Wstawianie danych do tabeli zdalnej przy użyciu funkcji OPENQUERY
Poniższy przykład wstawia wiersz do tabeli zdalnej, określając funkcję zestawu wierszy OPENQUERY . W tym przykładzie użyto nazwy serwera połączonego utworzonego w poprzednim przykładzie.
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.
INSERT OPENQUERY (MyLinkServer,
'SELECT Name, GroupName
FROM AdventureWorks2022.HumanResources.Department')
VALUES ('Environmental Impact', 'Engineering');
GO
O. Wstawianie danych do tabeli zdalnej przy użyciu funkcji OPENDATASOURCE
Poniższy przykład wstawia wiersz do tabeli zdalnej, określając funkcję zestawu wierszy OPENDATASOURCE . Określ prawidłową nazwę serwera dla źródła danych przy użyciu formatu server_name lub server_name\instance_name.
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.
-- 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. Wstawianie do tabeli zewnętrznej utworzonej przy użyciu technologii PolyBase
Eksportowanie danych z programu SQL Server do usługi Hadoop lub Azure Storage. Najpierw utwórz tabelę zewnętrzną wskazującą docelowy plik lub katalog. Następnie użyj polecenia INSERT INTO, aby wyeksportować dane z lokalnej tabeli programu SQL Server do zewnętrznego źródła danych. Instrukcja INSERT INTO tworzy plik docelowy lub katalog, jeśli nie istnieje, a wyniki instrukcji SELECT są eksportowane do określonej lokalizacji w określonym formacie pliku. Aby uzyskać więcej informacji, zobacz Wprowadzenie do programu PolyBase.
Dotyczy: 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;
Zbiorcze ładowanie danych z tabel lub plików danych
Przykłady w tej sekcji przedstawiają dwie metody zbiorczego ładowania danych do tabeli przy użyciu instrukcji INSERT.
Q. Wstawianie danych do sterta z minimalnym rejestrowaniem
Poniższy przykład tworzy nową tabelę (stertę) i wstawia do niej dane z innej tabeli przy użyciu minimalnego rejestrowania. W tym przykładzie przyjęto założenie, że model AdventureWorks2022
odzyskiwania bazy danych jest ustawiony na WARTOŚĆ PEŁNA. Aby upewnić się, że jest używane minimalne rejestrowanie, model AdventureWorks2022
odzyskiwania bazy danych jest ustawiony na BULK_LOGGED, zanim wiersze zostaną wstawione i zresetowane do pełnej po WSTAW DO... Instrukcja SELECT. Ponadto dla tabeli Sales.SalesHistory
docelowej określono wskazówkę TABLOCK . Gwarantuje to, że instrukcja używa minimalnej ilości miejsca w dzienniku transakcji i działa wydajnie.
-- 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. Używanie funkcji OPENROWSET z funkcją BULK w celu zbiorczego ładowania danych do tabeli
Poniższy przykład wstawia wiersze z pliku danych do tabeli, określając funkcję OPENROWSET. Wskazówka tabeli IGNORE_TRIGGERS jest określona na potrzeby optymalizacji wydajności. Aby uzyskać więcej przykładów, zobacz Importowanie danych zbiorczych przy użyciu operacji BULK INSERT lub OPENROWSET(BULK...) (SQL Server).
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.
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 ;
Zastępowanie domyślnego zachowania optymalizatora zapytań przy użyciu wskazówek
Przykłady w tej sekcji pokazują, jak za pomocą wskazówek tabeli tymczasowo zastąpić domyślne zachowanie optymalizatora zapytań podczas przetwarzania instrukcji INSERT.
Caution
Ponieważ optymalizator zapytań programu SQL Server zazwyczaj wybiera najlepszy plan wykonania zapytania, zalecamy, aby wskazówki były używane tylko jako ostateczność dla doświadczonych deweloperów i administratorów baz danych.
S. Używanie wskazówki TABLOCK w celu określenia metody blokowania
Poniższy przykład określa, że blokada wyłączności (X) jest wykonywana w tabeli Production.Location i jest przechowywana do końca instrukcji INSERT.
Dotyczy: SQL Server, SQL Database.
INSERT INTO Production.Location WITH (XLOCK)
(Name, CostRate, Availability)
VALUES ( N'Final Inventory', 15.00, 80.00);
Przechwytywanie wyników instrukcji INSERT
Przykłady w tej sekcji pokazują, jak używać klauzuli OUTPUT do zwracania informacji z lub wyrażeń na podstawie każdego wiersza, którego dotyczy instrukcja INSERT. Te wyniki można zwrócić do aplikacji przetwarzania do użycia w takich sytuacjach, jak komunikaty potwierdzające, archiwizacja i inne wymagania aplikacji.
T. Używanie instrukcji OUTPUT z instrukcją INSERT
Poniższy przykład wstawia wiersz do ScrapReason
tabeli i używa OUTPUT
klauzuli , aby zwrócić wyniki instrukcji do zmiennej @MyTableVar
tabeli. Ponieważ kolumna ScrapReasonID
jest zdefiniowana z właściwością IDENTITY
, wartość nie jest określona w instrukcji INSERT
dla tej kolumny. Należy jednak pamiętać, że wartość wygenerowana przez aparat bazy danych dla tej kolumny jest zwracana w OUTPUT
klauzuli w kolumnie INSERTED.ScrapReasonID
.
DECLARE @MyTableVar table( NewScrapReasonID smallint,
Name varchar(50),
ModifiedDate datetime);
INSERT Production.ScrapReason
OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
INTO @MyTableVar
VALUES (N'Operator error', GETDATE());
--Display the result set of the table variable.
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate
FROM Production.ScrapReason;
U. Używanie danych WYJŚCIOWYch z kolumnami tożsamości i obliczonymi
Poniższy przykład tworzy tabelę EmployeeSales
, a następnie wstawia do niej kilka wierszy przy użyciu instrukcji INSERT z instrukcją SELECT w celu pobrania danych z tabel źródłowych. Tabela EmployeeSales
zawiera kolumnę tożsamości (EmployeeID
) i obliczoną kolumnę (ProjectedSales
). Ponieważ te wartości są generowane przez aparat bazy danych podczas operacji wstawiania, żadna z tych kolumn nie może być zdefiniowana w pliku @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. Wstawianie danych zwracanych z klauzuli OUTPUT
Poniższy przykład przechwytuje dane zwrócone z klauzuli OUTPUT instrukcji MERGE i wstawia te dane do innej tabeli. Instrukcja MERGE aktualizuje kolumnę Quantity
ProductInventory
tabeli codziennie na podstawie zamówień przetworzonych w SalesOrderDetail
tabeli w bazie danych AdventureWorks2022. Usuwa również wiersze dla produktów, których zapasy spadają do 0. W przykładzie przechwytuje usunięte wiersze i wstawia je do innej tabeli, ZeroInventory
która śledzi produkty bez spisu.
--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. Wstawianie danych przy użyciu opcji SELECT
W poniższym przykładzie pokazano, jak wstawić wiele wierszy danych przy użyciu instrukcji INSERT z opcją SELECT.
INSERT
Pierwsza instrukcja używa SELECT
instrukcji bezpośrednio do pobierania danych z tabeli źródłowej, a następnie do przechowywania zestawu wyników w EmployeeTitles
tabeli.
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. Określanie etykiety za pomocą instrukcji INSERT
W poniższym przykładzie pokazano użycie etykiety z instrukcją INSERT.
-- Uses AdventureWorks
INSERT INTO DimCurrency
VALUES (500, N'C1', N'Currency1')
OPTION ( LABEL = N'label1' );
Y. Używanie etykiety i wskazówki zapytania z instrukcją INSERT
To zapytanie przedstawia podstawową składnię używania etykiety i wskazówki sprzężenia zapytania z instrukcją INSERT. Po przesłaniu zapytania do węzła sterowania program SQL Server uruchomiony w węzłach obliczeniowych zastosuje strategię sprzężenia skrótu podczas generowania planu zapytania programu SQL Server. Aby uzyskać więcej informacji na temat wskazówek sprzężenia i sposobu używania klauzuli OPTION, zobacz OPTION (SQL Server PDW).
-- Uses AdventureWorks
INSERT INTO DimCustomer (CustomerKey, CustomerAlternateKey,
FirstName, MiddleName, LastName )
SELECT ProspectiveBuyerKey, ProspectAlternateKey,
FirstName, MiddleName, LastName
FROM ProspectiveBuyer p JOIN DimGeography g ON p.PostalCode = g.PostalCode
WHERE g.CountryRegionCode = 'FR'
OPTION ( LABEL = 'Add French Prospects', HASH JOIN);
See Also
MASOWE WSTAWIANIE (Transact-SQL)
DELETE (Transact-SQL)
EXECUTE (Transact-SQL)
FROM (Transact-SQL)
IDENTITY (właściwość) (Transact-SQL)
NEWID (Transact-SQL)
SELECT (Transact-SQL)
UPDATE (Transact-SQL)
MERGE (Transact-SQL)
OUTPUT, klauzula (Transact-SQL)
Używanie wstawionych i usuniętych tabel