Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:SQL Server
База данных
SQL AzureУправляемый экземпляр
SQL AzureAzure Synapse Analytics
Система платформы аналитики (PDW)
Хранилище в Microsoft Fabric
База данных SQL в Microsoft Fabric
Добавляет одну или несколько строк в таблицу или представление в SQL Server. Примеры см. в разделе Примеры.
Соглашения о синтаксисе Transact-SQL
Tip
Microsoft Fabric Data Warehouse — это реляционное хранилище корпоративного масштаба на основе озера данных, с архитектурой, готовой к будущему, встроенным ИИ и новыми функциями. Если вы не знакомы с хранилищем данных, начните с Fabric Data Warehouse. Существующие рабочие нагрузки выделенных пулов SQL могут быть обновлены до Fabric для доступа к новым возможностям в области науки о данных, аналитики в реальном времени и создания отчётов.
Syntax
Синтаксис базы данных SQL Server и База данных SQL Azure и Fabric SQL
-- 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 ]
Синтаксис для Azure Synapse Analytics и параллельного хранилища данных и хранилища Microsoft Fabric
-- 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
С common_table_expression <>
Задаёт временное названное множество результатов, также известное как выражение INSERT общей таблицы, определённое в рамках этого оператора. Результирующий набор получается из инструкции SELECT. Дополнительные сведения см. в статье WITH common_table_expression (Transact-SQL).
TOP (выражение) [ PERCENT ]
Задает число или процент вставляемых случайных строк.
expression может быть либо числом, либо процентом от числа строк. Дополнительные сведения см. в разделе TOP (Transact-SQL).
INTO
Необязательное ключевое слово, которое можно использовать между INSERT и целевой таблицей.
server_name
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.
Имя связанного сервера, на котором расположены таблица или представление. server_name может указываться как имя связанного сервера или с помощью функции OPENDATASOURCE.
Когда server_name указывается как имя связанного сервера, необходимо указать database_name и schema_name. Если server_name указано с помощью OPENDATASOURCE, то аргументы database_name и schema_name могут применяться не ко всем источникам данных, в зависимости от возможностей поставщика OLE DB, который обращается к удаленному объекту.
database_name
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.
Имя базы данных.
schema_name
Имя схемы, которой принадлежит таблица или представление.
table_or view_name
Имя таблицы или представления, которые принимают данные.
Переменная таблицы в рамках своей области может использоваться как источник таблицы в INSERT операторе.
Представление, на которое ссылается аргумент table_or_view_name, должно быть обновляемым и ссылаться только на одну базовую таблицу в предложении FROM в представлении. Например, INSERT в многотаблицном представлении должен использоваться column_list , который ссылается только на столбцы из одной базовой таблицы. Для получения дополнительной информации об обновляемых видах см. CREATE VIEW (Transact-SQL).
rowset_function_limited
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.
Либо функция OPENQUERY, либо функция OPENROWSET. Использование этих функций зависит от возможностей поставщика OLE DB, который обращается к удаленному объекту.
С ( <table_hint_limited> [... n ] )
Задает одно или несколько табличных указаний, разрешенных для целевой таблицы. Ключевое слово WITH и круглые скобки обязательны.
Нельзя использовать подсказки READPAST, NOLOCK, и READUNCOMMITTED. Дополнительные сведения об указаниях по таблицам см. в разделе Указания по таблицам (Transact-SQL).
Important
Возможность указывать подсказки HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD или UPDLOCK на таблицах, являющихся целями INSERT операторов, будет удалена в будущей версии SQL Server. Эти подсказки не влияют на эффективность INSERT утверждений. Избегайте применять их в новых разработках и запланируйте внесение изменений в приложения, использующие их в настоящее время.
Указание подсказки TABLOCK в таблице, являющейся целью INSERT оператора, имеет тот же эффект, что и указание подсказки TABLOCKX. К таблице будет применена монопольная блокировка.
(column_list)
Список, состоящий из одного или нескольких столбцов, в которые вставляются данные. Список column_list должен быть заключен в круглые скобки, а его элементы должны разделяться запятыми.
Если столбец не находится в column_list, ядро СУБД должен иметь возможность предоставить значение на основе определения столбца; в противном случае строка не может быть загружена. Ядро СУБД автоматически предоставляет значение столбца, если столбец:
У него есть IDENTITY собственность. Используется следующее значение приращения для идентификатора.
Имеется стандартное значение. Используется стандартное значение для столбца.
Имеет тип данных timestamp. В этом случае используется текущее значение отметки времени.
Допускает значение NULL. Используется значение NULL.
Вычисляемый столбец. Используется вычисленное значение.
column_list необходимо использовать, когда явные значения вставляются в столбец идентичности, и опция SET IDENTITY_INSERT должна быть ВКЛЮЧЕНА для таблицы.
Клауза OUTPUT
Возвращает вставленные строки во время операции вставки. Результаты могут возвращаться в обрабатывающее приложение или вставляться в таблицу или табличную переменную для дальнейшей обработки.
Клауза OUTPUT не поддерживается в операторах DML, которые ссылаются на локальные разбитые представления, распределённые разбитые представления, удалённые таблицы или INSERT операторы, содержащие execute_statement. Клауза OUTPUT INTO не поддерживается в INSERT операторах, содержащих <клаузу dml_table_source> . Дополнительные сведения об аргументах и логике работы этого предложения см. в разделе Предложение OUTPUT (Transact-SQL).
VALUES
Позволяет использовать один или несколько списков вставляемых значений данных. Для каждого столбца в column_list, если этот параметр указан, или в таблице должно быть одно значение. Список значений должен быть заключен в скобки.
Если значения в списке идут в порядке, отличном от порядка следования столбцов в таблице, или не для каждого столбца таблицы определено значение, то необходимо использовать аргумент column_list для явного указания столбца, в котором хранится каждое входное значение.
Вы можете использовать конструктор Transact-SQL строк (также называемый конструктором таблицных значений) для задания нескольких строк в одном INSERT операторе. Этот конструктор строк состоит из одного предложения VALUES со списками из нескольких значений, заключенными в круглые скобки и разделенными запятыми. Дополнительные сведения см. в разделе Конструктор табличных значений (Transact-SQL).
Note
Конструктор значений таблиц в Azure Synapse Analytics не поддерживается. Вместо этого можно выполнить приведенные ниже инструкции INSERT для вставки нескольких строк. В Azure Synapse Analytics вставляемые значения могут быть только константными литералами или ссылками на переменные. Чтобы вставить нелитеральное значение, задайте переменной неконстантное значение и вставьте переменную.
DEFAULT
Принудительно ядро СУБД загрузить значение по умолчанию, определенное для столбца. Если для столбца не задано значение по умолчанию и он может содержать значение NULL, вставляется значение NULL. В столбцы с типом данных timestamp вставляется следующее значение метки времени.
DEFAULT недопустимо для столбца удостоверений.
expression
Константа, переменная или выражение. Выражение не может содержать инструкцию EXECUTE.
При ссылке на типы данных символов Юникода nchar, nvarchar и ntext выражение 'expression' должно начинаться с заглавной буквы 'N'. Если значение "N" не указано, SQL Server преобразует строку в кодовую страницу, соответствующую параметрам сортировки по умолчанию базы данных или столбца. Любые символы, не входящие в эту кодовую страницу, будут утрачены.
derived_table
Любая допустимая инструкция SELECT, возвращающая строки данных, которые загружаются в таблицу. Инструкция SELECT не может содержать обобщенное табличное выражение (CTE).
execute_statement
Любая допустимая инструкция EXECUTE, возвращающая данные с помощью инструкций SELECT или READTEXT. Дополнительные сведения см. в статье EXECUTE (Transact-SQL).
Параметры RESULT SETS оператора EXECUTE нельзя указать в INSERT... Заявление EXEC.
Если execute_statement используется с INSERT, каждый набор результатов должен быть совместим с столбцами таблицы или в column_list.
Аргумент execute_statement может применяться для выполнения хранимых процедур на том же сервере или на сервере, расположенном удаленно. На удаленном сервере выполняется процедура, результирующий набор возвращается на локальный сервер и загружается в таблицу на локальном сервере. В распределенной транзакции нельзя выполнить инструкцию execute_statement для связанного сервера с замыканием на себя, если при соединении включен режим MARS (множественный активный результирующий набор).
Если execute_statement возвращает данные с помощью инструкции READTEXT, каждая инструкция READTEXT может возвращать не более 1 МБ (1024 КБ) данных. execute_statement также может использоваться при работе с расширенными процедурами. execute_statement вставляет данные, возвращенные главным потоком расширенной процедуры; однако выходные данные из других потоков (кроме главного) не вставляются.
Нельзя указать параметр с таблицным значением в качестве целевой для INSERT оператора ECK; однако его можно указать как источник в INSERT строке EXEC или в процедуре сохранения. Дополнительные сведения см. в разделе Использование возвращающих табличные значения параметров (ядро СУБД).
<dml_table_source>
Указывает, что строки, вставленные в целевой таблицу, возвращаются клаузой OUTPUT для INSERTоператора , UPDATE, DELETEMERGE , или оператором, по желанию фильтруемой клаузой WHERE. Если <dml_table_source> указано, цель внешнего INSERT утверждения должна соответствовать следующим ограничениям:
Быть базовой таблицей, а не представлением.
Не быть удаленной таблицей.
Не иметь определенных для нее триггеров.
Не участвовать в связях «первичный-внешний ключ».
Объект не должен участвовать в репликации слиянием или обновляемых подписках для репликации транзакций.
Уровень совместимости базы данных должен быть не ниже 100. Дополнительные сведения см. в статье Предложение OUTPUT (Transact-SQL).
<select_list>
Список с разделителями-запятыми, указывающий, какие столбцы возвращены предложением OUTPUT для вставки. Столбцы в <select_list> должны быть совместимы со столбцами, в которые вставляются значения.
<select_list> не может ссылаться на агрегатные функции или TEXTPTR.
Note
Любые перечисленные в списке SELECT переменные ссылаются на свои исходные значения, независимо от любых изменений, внесенных в них в <dml_statement_with_output_clause>.
<dml_statement_with_output_clause>
Является допустимым INSERT, UPDATE, DELETE, или MERGE оператором, который возвращает затронутые строки в клаузе OUTPUT. Инструкция не может содержать предложение WITH и использовать удаленные таблицы или секционированные представления в качестве целевых. Если UPDATE указано или DELETE указано, это не может быть курсор UPDATE или DELETE. На исходные строки нельзя ссылаться как на вложенные инструкции DML.
ГДЕ <search_condition>
Любое предложение WHERE, содержащее допустимый критерий поиска <search_condition>, фильтрующее строки, которые возвращаются аргументом <dml_statement_with_output_clause>. Дополнительные сведения см. в разделе Условие поиска (Transact-SQL). При использовании в этом контексте критерий <search_condition> не должен содержать вложенных запросов, определяемых пользователем скалярных функций, выполняющих доступ к данным, агрегатных функций, TEXTPTR или предикатов полнотекстового поиска.
DEFAULT ЦЕННОСТИ
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.
Заполняет новую строку значениями по умолчанию, определенными для каждого столбца.
BULK
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.
Используется внешними средствами для передачи потока двоичных данных. Этот параметр не предназначен для использования с такими инструментами, как SQL Server Management Studio, SQLCMD, OSQL или интерфейсы программирования приложений доступа к данным, такие как собственный клиент SQL Server.
FIRE_TRIGGERS
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.
Указывает, что при передаче потока двоичных данных будут выполняться триггеры INSERT, определенные для целевой таблицы. Дополнительные сведения см. в разделе BULK INSERT (Transact-SQL).
CHECK_CONSTRAINTS
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.
Указывает, что при передаче потока двоичных данных будет выполняться проверка всех ограничений целевой таблицы или представления. Дополнительные сведения см. в разделе BULK INSERT (Transact-SQL).
KEEPNULLS
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.
Указывает, что пустые столбцы во время передачи потока двоичных данных должны сохранить значение NULL. Дополнительные сведения см. в разделе Сохранение значений Null или использование значений по умолчанию при массовом импорте данных (SQL Server).
KILOBYTES_PER_BATCH = kilobytes_per_batch
Определяет приблизительное число килобайт данных в пакете как kilobytes_per_batch. Дополнительные сведения см. в разделе BULK INSERT (Transact-SQL).
ROWS_PER_BATCH =rows_per_batch
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.
Указывает приблизительное число строк в потоке двоичных данных. Дополнительные сведения см. в разделе BULK INSERT (Transact-SQL).
Note
Если список столбцов отсутствует, то возникает синтаксическая ошибка.
Remarks
Для информации, специфичной для вставки данных в таблицы SQL, см. INSERT (SQL Graph).
Подсказка запроса MAXDOP не поддерживается во INSERT время операций SELECT, когда часть оператора SELECT читается из внешних источников.
Лучшие практики
Используйте функцию @@ROWCOUNT для возврата количества вставленных строк в клиентское приложение. Для получения дополнительной информации смотрите @@ROWCOUNT (Transact-SQL).
Рекомендации по массовому импорту данных
Используя INSERT INTO... SELECT для массового импорта данных с минимальным логированием и параллелизмом
Инструкция INSERT INTO <target_table> SELECT <columns> FROM <source_table> может эффективно перенести большое количество строк из одной таблицы (например, промежуточной) в другую таблицу с минимальным протоколированием. Минимальное протоколирование может повысить производительность выполнения инструкции и снизить вероятность того, что во время операции будет заполнен весь журнал транзакций.
Для минимального протоколирования этой инструкции необходимо выполнение следующих требований.
- Модель восстановления базы данных настроена на простое или неполное протоколирование.
- целевой таблицей должны быть пустая или непустая куча;
- Целевая таблица не используется в репликации.
- для целевой таблицы должно использоваться указание
TABLOCK.
Строки, вставленные в кучу в результате действия вставки в операторе MERGE , также могут быть минимально логированы.
В отличие от инструкции BULK INSERT, которая удерживает менее строгую блокировку массового обновления, инструкция INSERT INTO ... SELECT с указанием TABLOCK удерживает монопольную блокировку (X) таблицы. Это означает, что отсутствует возможность вставки строк с помощью нескольких операций вставки, которые выполняются одновременно.
Однако начиная с SQL Server 2016 (13.x) и уровня совместимости базы данных 130, одна INSERT INTO ... SELECT инструкция может выполняться параллельно при вставке в кучу или кластеризованных индексов columnstore (CCI). При использовании указания TABLOCK можно выполнять вставку параллельно.
Требования к параллелизму для указанной выше инструкции (аналогичны требованиям для минимального ведения журнала):
- целевой таблицей должны быть пустая или непустая куча;
- в целевой таблице должны быть кластеризованные индексы columnstore (CCI), но не должно быть некластеризованных индексов;
- Целевой таблица не имеет столбца идентичности с IDENTITY_INSERT установленным в OFF.
- для целевой таблицы должно использоваться указание
TABLOCK.
Для сценариев, когда требования к минимальному ведению журналов и параллельной вставке соблюдены, оба улучшения будут работать совместно, чтобы обеспечить максимальную пропускную способность для ваших операций загрузки данных.
Для получения дополнительной информации об использовании INSERT на вашем складе в Microsoft Fabric см. раздел «Ввести данные в ваш склад с помощью Transact-SQL».
Note
Операции вставки в локальные временные таблицы (определяемые префиксом #) и глобальные временные таблицы (определяемые префиксами ##) также поддерживают параллелизм с использованием указания TABLOCK.
Использование предложений OPENROWSET и BULK для массового импорта данных
Функция OPENROWSET может принимать следующие подсказки для таблицы, которые обеспечивают оптимизацию массовой загрузки с помощью оператора INSERT :
- Использование указания
TABLOCKможет свести к минимуму число записей в журнале для операции вставки. Для базы данных должна быть установлена простая модель восстановления или модель восстановления с неполным протоколированием. Кроме того, целевая таблица не может использоваться в репликации. Дополнительные сведения см. в разделе Предварительные условия для минимального протоколирования массового импорта данных. - При использовании указания
TABLOCKможно выполнять операции вставки параллельно. Целевая таблица должна быть кучей или кластеризованным индексом columnstore (CCI). При этом не должно быть некластеризованных индексов и для целевой таблицы не должен быть указан столбец идентификаторов. - Проверку ограничений FOREIGN KEY и CHECK можно временно отключить с помощью указания
IGNORE_CONSTRAINTS. - Выполнение триггеров можно временно отключить с помощью указания
IGNORE_TRIGGERS. - Указание
KEEPDEFAULTSпозволяет вставить установленное по умолчанию значение столбца таблицы, если таковое имеется, вместо значения NULL, применяемого в случае, когда запись данных не содержит значения для этого столбца. - Указание
KEEPIDENTITYпозволяет использовать значения идентификаторов в файле импортированных данных для столбца идентификаторов в целевой таблице.
Эти оптимизации похожи на оптимизации, доступные для команды BULK INSERT. Дополнительные сведения см. в статье Указания по таблицам (Transact-SQL).
Типы данных
При вставке строк необходимо учитывать поведение следующих типов данных:
Если значение загружается в столбцы с типом даных char, varchar или varbinary , заполнение или усечение последующих пустых счётов (пробелы для char и varchar, нули для varbinary) определяется SET ANSI_PADDING настройками, определёнными для столбца при создании таблицы. Дополнительные сведения см. в разделе SET ANSI_PADDING (Transact-SQL).
В следующей таблице показана операция по умолчанию для SET ANSI_PADDING OFF.
Тип данных Стандартная работа char Заполнение значения пробелами до заданной ширины столбца. varchar Удаление конечных пробелов до последнего непробельного символа или до одного пробела, если строка состоит только из пробелов. varbinary Удаление конечных нулей. Если пустая строка (' ') загружена в столбец с типом данных varchar или text, то операцией по умолчанию будет загрузка строки нулевой длины.
Вставка значения NULL в столбец text или image не приводит ни к созданию допустимого текстового указателя, ни к предварительному распределению 8-килобайтной текстовой страницы.
Столбцы, созданные с типом данных uniqueidentifier, содержат двоичные 16-байтные значения специального формата. В отличие от столбцов удостоверений, ядро СУБД не создает значения для столбцов с типом данных uniqueidentifier. При вставке переменные с типом данных uniqueidentifier и константы строк в форме xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 символов, включая дефисы, где x является шестнадцатеричной цифрой в диапазоне 0–9 или a–f) могут быть использованы для столбцов uniqueidentifier. Например, 6F9619FF-8B86-D011-B42D-00C04FC964FF является допустимым значением переменной или столбца uniqueidentifier. Используйте функцию NEWID() для получения идентификатора GUID.
Вставка значений в столбцы определяемого пользователем типа
Вставлять значения в столбцы определяемого пользователем типа можно следующими способами.
Предоставление значения определяемого пользователем типа.
Предоставление значения в системном типе данных SQL Server, если определяемый пользователем тип поддерживает неявное или явное преобразование из этого типа. В следующем примере показано, как вставляются значения из столбца определяемого пользователем типа
Pointпутем явного преобразования из строки.INSERT INTO Cities (Location) VALUES ( CONVERT(Point, '12.3:46.2') );Двоичное значение также может предоставляться без выполнения явного преобразования, так как все определяемые пользователем типы могут быть неявно преобразованы из двоичного.
Вызов определяемой пользователем функции, которая возвращает значение определяемого пользователем типа. В следующих примерах используется определяемая пользователем функция
CreateNewPoint()для создания новых значений определяемого пользователем типаPointи вставки значения в таблицуCities.INSERT INTO Cities (Location) VALUES ( dbo.CreateNewPoint(x, y) );
Обработка ошибок
Вы можете реализовать обработку ошибок для INSERT оператора, указав его в TRY... CATCH конструкт.
Если INSERT оператор нарушает ограничение или правило, либо имеет значение, несовместимое с типом данных столбца, оператор не работает, и возвращается сообщение об ошибке.
Если INSERT загружается несколько строк с помощью SELECT или EXECUTE, любое нарушение правила или ограничения, возникающее при загружаемых значениях, приводит к остановке оператора, и строки не загружаются.
Когда INSERT оператор сталкивается с арифметической ошибкой (переполнение, деление на ноль или ошибка домена), возникающая при вычислении выражения, ядро СУБД обрабатывает эти ошибки так, будто SET ARITHABORT установлен в ON. Выполнение пакета прекращается и выводится сообщение об ошибке. Во время оценки выражений, когда SET ARITHABORT иSET ANSI_WARNINGSSETВЫКЛЮЧЕНЫ, если INSERTоператор , DELETE или UPDATE сталкивается с арифметической ошибкой, переполнением, делением на ноль или ошибкой домена, SQL Server вставляет или обновляет значение NULL. Если целевой столбец не пустой, вставка или обновление не осуществляются, и пользователь получает ошибку.
Interoperability
Когда INSTEAD OF триггер определяется на INSERT действиях против таблицы или представления, триггер выполняется вместо оператора INSERT . Для получения дополнительной информации о INSTEAD OF триггерах см. CREATE TRIGGER (Transact-SQL).
Ограничения
Если во время вставки значений в удаленные таблицы указаны не все значения для всех столбцов, то необходимо указать столбцы, в которые вставляются заданные значения.
Когда используется TOP, INSERT указанные строки не располагаются в каком-либо порядке, и клауза ORDER BY нельзя указывать напрямую в этих операторах. Если для вставки строк в значимом хронологическом порядке необходимо использовать предложение TOP, вместе с ним в инструкции подзапроса выборки следует использовать предложение ORDER BY. См. подраздел «Примеры» далее в этом разделе.
INSERT запросы, использующие SELECT с ORDER BY для заполнения строк, гарантируют, как вычисляются значения идентичности, но не порядок вставки строк.
В Parallel Data Warehouse клауза ORDER BY недопустима в VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, inline functions, производных таблицах, подзапросах и общих выражениях таблиц, если только не указан также TOP.
Поведение ведения логов
Оператор всегда полностью регистрируется INSERT , кроме случаев использования функции OPENROWSET с ключевым словом BULK или при использовании INSERT INTO <target_table> SELECT <columns> FROM <source_table>. Для этих операций возможно минимальное протоколирование. Дополнительные сведения см. в подразделе «Рекомендации по массовой загрузке данных» этого раздела.
Security
При соединении со связанным сервером отправляющий сервер указывает имя входа и пароль для подключения к принимающему серверу от его имени. Для работы этого соединения необходимо создать сопоставление имен входа между связанными серверами вызовом хранимой процедуры sp_addlinkedsrvlogin.
При использовании OPENROWSET(BULK...) важно понимать, как SQL Server обрабатывает олицетворение. Для получения дополнительной информации см. раздел «Соображения безопасности» в разделе Import Bulk Data by Using BULK INSERT или OPENROWSET(BULK...) (SQL Server).
Permissions
INSERT Требуется разрешение на целевую таблицу.
INSERT По умолчанию права доступны для членов sysadmin роли фиксированного сервера, ролей db_owner базы данных и db_datawriter владельца таблицы. Члены ролей sysadmin, db_owner и db_securityadmin, а также владелец таблицы могут передавать разрешения другим пользователям.
Чтобы выполнить INSERT функцию OPENROWSET с опцией BULK, вы должны быть членом роли sysadmin фиксированного сервера или роли bulkadmin фиксированного сервера.
Examples
| Category | Используемые элементы синтаксиса |
|---|---|
| Базовый синтаксис | INSERT * конструктор таблицных значений |
| Обработка значений столбца | IDENTITY * NEWID * значения по умолчанию * пользовательские типы |
| Вставка данных из других таблиц | INSERT... ВЫБЕРИТЕ * INSERT... EXECUTE * С общим выражением таблицы * TOP * OFFSET FETCH |
| Указание целевых объектов, отличных от стандартных таблиц | Представления * табличные переменные |
| Вставка строк в удаленную таблицу | Связанный сервер * функция набора строк OPENQUERY * функция набора строк OPENDATASOURCE |
| Массовая загрузка данных из таблиц или файлов данных | INSERT... SELECT * функция OPENROWSET |
| Переопределение поведения по умолчанию для оптимизатора запросов с помощью указаний | Табличные указания |
| Захват результатов INSERT утверждения | Предложение OUTPUT |
Базовый синтаксис
Примеры в этом разделе демонстрируют базовую функциональность INSERT оператора с использованием минимально необходимого синтаксиса.
A. Вставка одной строки данных
Следующий пример вставляет одну строку в Production.UnitMeasure таблицу базы данных AdventureWorks2025. В этой таблице содержатся столбцы UnitMeasureCode, Name и ModifiedDate. Так как значения для всех столбцов предоставлены и перечислены в том же порядке, что и столбцы в таблице, не требуется указывать имена столбцов в списке столбцов*.*
INSERT INTO Production.UnitMeasure
VALUES (N'FT', N'Feet', '20080414');
B. Вставка нескольких строк данных
В следующем примере конструктор значений таблицы используется для вставки трёх строк в Production.UnitMeasure таблицу базы данных AdventureWorks2025 в одном INSERT операторе. Так как значения для всех столбцов предоставлены и перечислены в том же порядке, что и столбцы в таблице, то не нужно в параметре указывать имена столбцов.
Note
Конструктор значений таблицы не поддерживается в 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. Вставка данных в порядке, отличном от порядка столбцов таблицы
В следующем примере используется список столбцов для явного указания значений, которые будут вставляться в каждый столбец. Порядок столбцов в Production.UnitMeasure таблице базы данных AdventureWorks2025 — UnitMeasureCode, NameModifiedDate; однако столбцы в column_list не указаны в таком порядке.
INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,
ModifiedDate)
VALUES (N'Square Yards', N'Y2', GETDATE());
Обработка значений столбцов
Примеры в этом разделе демонстрируют методы вставки значений в столбцы, которые определяются с IDENTITY помощью свойства, DEFAULT значения или определяются типами данных, такими как уникальный идентификатор или пользовательские столбцы.
D. Вставка данных в таблицу со столбцами, имеющими значение по умолчанию
В следующем примере показана вставка строк в таблицу со столбцами, для которых автоматически создается значение или которые имеют значение по умолчанию.
Column_1 — это вычисляемый столбец, который автоматически создает значение, объединяя строку со значением, вставленным в столбец column_2. Столбец Column_2 определен с ограничением по умолчанию. Если для этого столбца не указано значение, используется значение по умолчанию. Столбец Column_3 имеет тип данных rowversion, который автоматически создает уникальное, последовательно увеличиваемое двоичное число. Столбец Column_4 не формирует значения автоматически. Если значение для этого столбца отсутствует, то вставляется значение NULL. Операторы INSERT вставляют строки, содержащие значения для некоторых столбцов, но не для всех. В последнем INSERT операторе столбцы не указаны, только значения по умолчанию вставляются с 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. Вставка данных в таблицу со столбцом идентификаторов
В следующем примере показаны различные методы вставки данных в столбец идентификаторов. Первые два INSERT оператора позволяют генерировать тождественные значения для новых строк. Третий INSERT оператор переопределяет IDENTITY свойство столбца с SETSET IDENTITY_INSERT этим оператором и вставляет явное значение в столбец идентичности.
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. Вставка данных в столбец типа uniqueidentifier с помощью функции NEWID()
В следующем примере функция NEWID() вызывается для вставки идентификатора GUID в столбец column_2. В отличие от столбцов удостоверений, ядро СУБД не создает значения для столбцов с типом данных uniqueidentifier, как показано во втором INSERT операторе.
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. Вставка данных в столбцы определяемого пользователем типа
Следующие инструкции Transact-SQL вставляют три строки в столбец PointValue таблицы Points. Этот столбец имеет определяемый пользователем тип данных CLR. Тип данных Point состоит из целочисленных значений X и Y, которые представлены как свойства определяемого пользователем типа. Необходимо привести разделяемые запятой значения X и Y к типу Point с помощью функции CAST или CONVERT. Первые две инструкции используют функцию CONVERT для преобразования строкового значения в тип Point, а третья инструкция использует функцию CAST. Дополнительные сведения см. в разделе Работа с данными определяемого пользователем типа.
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));
Вставка данных из других таблиц
В примерах этого раздела показаны методы вставки строк из одной таблицы в другую.
H. Вставка данных из других таблиц с помощью параметров SELECT и EXECUTE
Следующий пример показывает, как вставить данные из одной таблицы в другую, используя INSERT... SELECT или INSERT... ВЫПОЛНЯЙ. Каждый метод основан на многотабличной инструкции SELECT, содержащей выражение и литеральное значение в списке столбцов.
Первый INSERT оператор использует оператор SELECT для вывода данных из исходных таблиц (Employee, SalesPersonи Person) в базе данных AdventureWorks2025 и хранения результатов в EmployeeSales таблице. Второй INSERT оператор использует клаузу EXECUTE для вызова сохранённой процедуры, содержащей оператор SELECT, а третий INSERT использует клаузу EXECUTE для ссылки на оператор SELECT как на литеральную строку.
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. Использование обобщенного табличного выражения WITH для определения вставляемых данных
Следующий пример создаёт NewEmployee таблицу в базе данных AdventureWorks2025. Обобщенное табличное выражение (EmployeeTemp) определяет строки из одной или нескольких таблиц, которые вставляются в таблицу NewEmployee. Оператор INSERT ссылается на столбцы в выражении общей таблицы.
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. Использование TOP для ограничения данных, вставляемых из исходной таблицы
Следующий пример создаёт таблицу EmployeeSales и вставляет имя и данные о продажах с начала года для 5 лучших случайных сотрудников из таблицы HumanResources.Employee в базу данных AdventureWorks2025. Оператор INSERT выбирает любые 5 строк, возвращаемых оператором SELECT . Предложение OUTPUT отображает строки, вставляемые в таблицу EmployeeSales. Обратите внимание, что предложение ORDER BY в инструкции SELECT не используется для определения 5 наиболее успешных сотрудников.
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;
Если для вставки строк в значимом хронологическом порядке решено использовать предложение TOP, вместе с ним в инструкции подзапроса выборки следует использовать предложение ORDER BY, как показано в следующем примере. Предложение OUTPUT отображает строки, вставляемые в таблицу EmployeeSales. Обратите внимание, что вставка данных 5 наиболее успешных сотрудников выполняется на основе результатов предложения ORDER BY, а не случайных строк.
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;
Указание целевых объектов, отличных от стандартных таблиц
В примерах этого раздела показаны методы вставки строк с указанием представления или табличной переменной.
K. Вставка данных с указанием представления
В следующем примере в качестве целевого объекта указано имя представления; новая строка вставляется в базовую таблицу. Порядок следования значений в инструкции INSERT должен совпадать с порядком следования столбцов в представлении. Дополнительные сведения см. в разделе Изменение данных через представление.
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. Вставка данных в табличную переменную
В следующем примере в базе данных AdventureWorks2025 указана переменная таблицы в качестве целевого объекта.
-- 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
Вставка строк в удаленную таблицу
В примерах в этом разделе описаны способы вставки в удаленную целевую таблицу с использованием в качестве ссылки на удаленную таблицу связанного сервера или функции, возвращающей набор строк.
M. Вставка данных в удаленную таблицу с использованием связанного сервера
В следующем примере в удаленную таблицу вставляются строки. Этот пример начинается с создания ссылки на удаленный источник данных с помощью хранимой процедуры sp_addlinkedserver. Имя связанного сервера, MyLinkServer, затем определяется как часть четырехчастного имени объекта в форме server.catalog.schema.object.
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.
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. Вставка данных в удаленную таблицу с помощью функции OPENQUERY
В следующем примере выполняется вставка строки в удаленную таблицу с помощью вызова функции OPENQUERY, возвращающей набор строк. В этом примере используется имя связанного сервера, созданного в предыдущем примере.
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.
INSERT OPENQUERY (MyLinkServer,
'SELECT Name, GroupName
FROM AdventureWorks2022.HumanResources.Department')
VALUES ('Environmental Impact', 'Engineering');
GO
O. Вставка данных в удаленную таблицу с помощью функции OPENDATASOURCE
В следующем примере выполняется вставка строки в удаленную таблицу с помощью вызова функции OPENDATASOURCE, возвращающей набор строк. Определите допустимое имя сервера для источника данных, используя формат server_name или server_name\instance_name.
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.
-- 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. Вставка во внешнюю таблицу, созданную с помощью PolyBase
Вы можете экспортировать данные из SQL Server в службу хранилища Azure или Hadoop. Для этого сначала необходимо создать внешнюю таблицу, которая указывает на целевой файл или каталог. Затем используйте INSERT INTO для экспорта данных из локальной таблицы SQL Server во внешний источник данных. INSERT Оператор INTO создаёт целевой файл или каталог, если он не существует, а результаты оператора SELECT экспортируются в указанное место в указанном формате файла. Дополнительные сведения см. в разделе Приступая к работе с PolyBase.
Область применения: 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;
Массовая загрузка данных из таблиц или файлов данных
Примеры в этом разделе демонстрируют два способа массовой загрузки данных в таблицу с помощью INSERT оператора.
Q. Вставка данных в кучу с минимальным протоколированием
В следующем примере создается таблица (куча), в которую вставляются данные из другой таблицы с минимальным протоколированием. В примере предполагается, что для базы данных AdventureWorks2025 выбрана модель восстановления FULL. Для минимального использования логирования модель восстановления AdventureWorks2025 базы данных устанавливается на BULK_LOGGED до вставки строк и сбрасывается в FULL после INSERT INTO... Оператор SELECT. Кроме того, для целевой таблицы Sales.SalesHistory указывается подсказка TABLOCK. Это обеспечивает минимальное использование журнала транзакций инструкцией и ее эффективное выполнение.
-- 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. Использование функции OPENROWSET с параметром BULK для массовой загрузки данных а таблицу
В следующем примере выполняется вставка строки в таблицу из файла данных вызовом функции OPENQUERY. Для оптимизации производительности указывается табличная подсказка IGNORE_TRIGGERS. Для дополнительных примеров см. Import Bulk Data by Using BULK INSERT или OPENROWSET(BULK...) (SQL Server).
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.
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 ;
Переопределение поведения по умолчанию для оптимизатора запросов с помощью указаний
Примеры в этом разделе демонстрируют, как использовать подсказки таблицы для временного переопределения поведения оптимизатора запросов по умолчанию при обработке INSERT оператора.
Caution
Так как оптимизатор запросов SQL Server обычно выбирает оптимальный план выполнения для запроса, мы рекомендуем использовать указания только в качестве последнего средства опытными разработчиками и администраторами баз данных.
S. Использование подсказки TABLOCK для указания метода блокировки
В следующем примере указано, что эксклюзивный (X) замок принимается в таблице Production.Location и сохраняется до конца INSERT оператора.
Применимо к: SQL Server, База данных SQL.
INSERT INTO Production.Location WITH (XLOCK)
(Name, CostRate, Availability)
VALUES ( N'Final Inventory', 15.00, 80.00);
Фиксация результатов INSERT утверждения
Примеры в этом разделе демонстрируют, как использовать клаузу OUTPUT для возврата информации или выражений, основанных на каждой строке, на которую влияет INSERT оператор. Эти результаты могут быть возвращены приложению, например для вывода подтверждающих сообщений, архивирования и т. п.
T. Использование OUTPUT с INSERT оператором
В следующем примере производится вставка строки в таблицу ScrapReason, а затем при помощи предложения OUTPUT результаты выполнения инструкции возвращаются в табличную переменную @MyTableVar. Так как столбец ScrapReasonID определен с помощью свойства IDENTITY, то значение для этого столбца не указано в инструкции INSERT. Однако обратите внимание, что значение, созданное ядро СУБД для этого столбца, возвращается в OUTPUT предложении в столбце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. Применение предложения OUTPUT со столбцами идентификаторов и вычисляемыми столбцами
Следующий пример создаёт EmployeeSales таблицу и затем вставляет в неё несколько строк с помощью INSERT оператора SELECT для извлечения данных из исходных таблиц. Таблица EmployeeSales содержит столбец идентификаторов (EmployeeID) и вычисляемый столбец (ProjectedSales). Так как эти значения создаются ядро СУБД во время операции вставки, ни в этих столбцах не могут быть определены@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. Вставка данных, возвращенных предложением OUTPUT
Следующий пример фиксирует данные, возвращаемые из клаузы OUTPUT оператора MERGE , и вставляет эти данные в другую таблицу. Выписка MERGE обновляет Quantity столбец ProductInventory таблицы ежедневно на основе заказов, которые обрабатываются в SalesOrderDetail таблице базы данных AdventureWorks2025. Инструкция также удаляет строки с продуктами, запас которых сократился до 0. В примере собираются удаленные строки и вставляются в другую таблицу, ZeroInventory, в которой ведется учет закончившихся продуктов.
--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. Вставка данных с помощью параметра SELECT
Следующий пример показывает, как вставить несколько строк данных с помощью INSERT оператора с опцией SELECT. Первая инструкция INSERT напрямую использует инструкцию SELECT для получения данных из исходной таблицы и сохранения результирующего набора в таблице EmployeeTitles.
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. Указание метки с оператором INSERT
Следующий пример показывает использование метки с INSERT оператором.
-- Uses AdventureWorks
INSERT INTO DimCurrency
VALUES (500, N'C1', N'Currency1')
OPTION ( LABEL = N'label1' );
Y. Использование метки и подсказки запроса с INSERT утверждением
Этот запрос показывает базовый синтаксис использования метки и подсказки для join запроса с оператором INSERT . После отправки запроса на узел Control SQL Server, работающий на вычислительных узлах, будет применять стратегию хэш-соединения при создании плана запросов SQL Server. Дополнительные сведения об указаниях по соединению и использованию предложения OPTION см. в разделе 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);
См. также
BULK INSERT (Transact-SQL)
DELETE (Transact-SQL)
EXECUTE (Transact-SQL)
ОТ (Transact-SQL)
IDENTITY (Свойство) (Transact-SQL)
NEWID (Transact-SQL)
SELECT (Transact-SQL)
UPDATE (Transact-SQL)
MERGE (Transact-SQL)
Предложение OUTPUT (Transact-SQL)
Использование вставленных и удаленных таблиц