INSERT (Transact-SQL)

Добавляет новую строку к таблице или представлению.

Значок ссылки на разделСоглашения о синтаксическом обозначении в Transact-SQL

Синтаксис

[ WITH <common_table_expression> [ ,...n ] ]
INSERT 
    [ TOP ( expression ) [ PERCENT ] ] 
    [ INTO] 
    { <object> | rowset_function_limited 
      [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
    }
{
    [ ( column_list ) ] 
    [ <OUTPUT Clause> ]
    { VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) 
    | derived_table 
    | execute_statement 
    } 
} 
    | DEFAULT VALUES 
[; ]

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

Аргументы

  • WITH <common_table_expression>
    Определяет временный именованный результирующий набор, также называемый обобщенным табличным выражением, определенным в области инструкции INSERT. Результирующий набор получается из инструкции SELECT.

    Обобщенные табличные выражения также используются инструкциями SELECT, DELETE, UPDATE и CREATE VIEW. Дополнительные сведения см. в разделе WITH общее_табличное_выражение (Transact-SQL).

  • TOP (expression) [ PERCENT ]
    Задает количество или процент случайных строк для вставки. Выражение expression может быть либо количеством, либо процентом строк. Строки, на которые ссылается выражение TOP, используемое с INSERT, UPDATE и DELETE, не упорядочены.

    В инструкциях INSERT, UPDATE и DELETE необходимо разделять круглыми скобками аргумент expression в выражении TOP. Дополнительные сведения см. в разделе TOP (Transact-SQL).

  • INTO
    Необязательное ключевое слово, которое можно использовать между ключевым словом INSERT и целевой таблицей.
  • server_name
    Имя сервера (используется функцией OPENDATASOURCE как имя сервера), на котором находится таблица или представление. Если указан аргумент server_name, также необходимо указать аргументы database_name и schema_name.
  • database_name
    Имя базы данных.
  • schema_name
    Имя схемы, к которой принадлежит таблица или представление.
  • table_or view_name
    Имя таблицы или представления, которые принимают данные.

    Переменную table внутри своей области можно использовать как имя исходной таблицы в инструкции INSERT.

    Представление, на которое ссылается аргумент table_or_view_name, должно быть обновляемым и ссылаться ровно на одну базовую таблицу в предложении FROM данного представления. Например, инструкция INSERT в многотабличном представлении должна использовать аргумент column_list, который ссылается только на столбцы из одной базовой таблицы. Дополнительные сведения об обновляемых представлениях см. в разделе CREATE VIEW (Transact-SQL).

  • rowset_function_limited
    Либо функция OPENQUERY, либо функция OPENROWSET.
  • WITH ( <table_hint_limited> [... n ] )
    Указывает одну или несколько табличных подсказок, разрешенных для целевой таблицы. Необходимо использовать ключевое слово WITH и круглые скобки.

    Нельзя использовать подсказки READPAST, NOLOCK, и READUNCOMMITTED. Дополнительные сведения о табличных подсказках см. в разделе Табличная подсказка (Transact-SQL).

    ms174335.note(ru-ru,SQL.90).gifВажно!
    Возможность указать подсказки HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD или UPDLOCK в целевых таблицах инструкций INSERT будет удалена в будущих версиях SQL Server. Эти подсказки не влияют на производительность инструкций INSERT. Избегайте применять их в новых разработках и запланируйте внесение изменений в приложения, использующие их в настоящее время.

    Указание подсказки TABLOCK для целевой таблицы инструкции INSERT приведет к тем же последствиям, что и указание подсказки TABLOCKX. К таблице будет применена монопольная блокировка.

  • (column_list)
    Список из одного или нескольких столбцов, в которые нужно вставить данные. Аргумент column_list должен быть заключен в круглые скобки и разделен запятыми.

    Если столбец не внесен в column_list, то компонент SQL Server 2005 Database Engine должен обеспечить значение, основанное на определении столбца; в противном случае строку нельзя будет загрузить. Компонент Database Engine автоматически задает значение для столбца, если столбец имеет следующие характеристики.

    • Имеется свойство IDENTITY. Используется следующее значение приращения для идентификатора.
    • Имеется стандартное значение. Используется стандартное значение для столбца.
    • Имеет тип данных timestamp. В этом случае используется текущее значение timestamp.
    • Неопределенное значение. Используется значение Null.
    • Вычисляемый столбец. Используется вычисленное значение.

    Аргумент column_list и список VALUES необходимо использовать, когда в столбец идентификаторов вставляются явно заданные значения, а параметру SET IDENTITY_INSERT необходимо присвоить значение ON для таблицы.

  • Предложение OUTPUT
    Возвращает вставленные строки во время операции вставки. Предложение OUTPUT не поддерживается инструкциями DML, которые ссылаются на локальные секционированные представления, распределенные секционированные представления, расположенные удаленно таблицы или инструкции INSERT, содержащие аргумент execute_statement.
  • VALUES
    Ввод списка со значениями данных для вставки. Для каждого столбца в column_list, если этот параметр указан или присутствует в таблице, должно быть одно значение. Список значений должен быть заключен в круглые скобки.

    Если значения в списке VALUES идут в порядке, отличном от порядка следования столбцов в таблице, или не для каждого столбца таблицы определено значение, то необходимо использовать аргумент column_list для явного указания столбца для хранения каждого входного значения.

  • DEFAULT
    Указывает компоненту Database Engine необходимость принудительно загружать значения по умолчанию, определенные для столбца. Если для столбца не задано значение по умолчанию и он может содержать значение NULL, вставляется значение NULL. В столбцы с типом данных timestamp вставляется следующее значение временной метки. Значение DEFAULT недопустимо для столбца идентификаторов.
  • expression
    Константа, переменная или выражение. В выражении не может содержаться инструкция SELECT или EXECUTE.
  • derived_table
    Любая допустимая инструкция SELECT, возвращающая строки данных, которые загружаются в таблицу. Инструкция SELECT не может содержать обобщенное табличное выражение (CTE).
  • execute_statement
    Любая допустимая инструкция EXECUTE, возвращающая данные с помощью инструкций SELECT или READTEXT. Инструкция SELECT не может содержать CTE-выражение.

    Если аргумент execute_statement используется с инструкцией INSERT, каждый результирующий набор должен быть совместим со столбцами в таблице или списке column_list.

    Аргумент execute_statement может применяться для выполнения хранимых процедур на том же сервере или на сервере, расположенном удаленно. На удаленном сервере выполняется процедура, результирующий набор возвращается на локальный сервер и загружается в таблицу на локальном сервере.

    В SQL Server 2008 изменена семантика транзакций инструкций INSERT...EXECUTE, выполняемых на связанном сервере с замыканием на себя. В SQL Server 2005 этот сценарий не поддерживается и приводит к ошибкам. В SQL Server 2008 инструкция INSERT...EXECUTE может применяться к связанному серверу с замыканием на себя, когда для соединения не включен режим MARS. Если режим MARS не включен для соединения, то поведение такое же, как в SQL Server 2005.

    Если аргумент execute_statement возвращает данные с инструкцией READTEXT, необходимо учитывать, что каждая инструкция READTEXT может возвращать не более 1 МБ (1024 КБ) данных. Аргумент execute_statement также может использоваться с расширенными процедурами. В этом случае он вставляет данные, возвращенные основным потоком расширенной процедуры, но выходные данные, возвращенные потоками, отличными от основного, не будут вставлены.

  • DEFAULT VALUES
    Заполняет новую строку значениями по умолчанию, определенными для каждого столбца.

Замечания

Инструкция INSERT добавляет новые строки к таблице. Чтобы заменить данные в таблице, перед загрузкой новых данных с помощью инструкции INSERT необходимо применить инструкции DELETE или TRUNCATE TABLE для очистки существующих данных. Чтобы изменить значения столбцов в существующих строках, используйте инструкцию UPDATE. Можно создать новую таблицу и загрузить в нее данные за один шаг с помощью параметра INTO инструкции SELECT.

Столбцы, созданные с типом данных uniqueidentifier, содержат двоичные 16-байтные величины специального формата. В отличие от столбцов идентификаторов компонента Database Engine не создает автоматически значения для столбцов с типом данных uniqueidentifier. Во время операции вставки переменные с типом данных uniqueidentifier и строковые константы вида xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 символов, включая дефисы, где x — шестнадцатеричная цифра в диапазоне от 0-9 или a-f) можно использовать для столбцов uniqueidentifier. Например, 6F9619FF-8B86-D011-B42D-00C04FC964FF является допустимым значением переменной uniqueidentifier или столбца. Используйте функцию NEWID() для получения глобального уникального идентификатора (идентификатор GUID).

Инструкции INSERT не учитывает настройки параметра SET ROWCOUNT в местных и расположенных удаленно секционированных представлениях. Также этот параметр не поддерживается инструкциями INSERT для удаленных таблиц в компоненте Database Engine в случае, если уровень совместимости 80 или выше.

Если при выполнении инструкции INSERT возникает арифметическая ошибка (переполнение, деление на ноль или ошибка домена), компонент Database Engine обрабатывает эти ошибки так же, как если бы параметру SET ARITHABORT было присвоено значение ON. Выполнение пакета прекращается и выводится сообщение об ошибке.

Правила вставки строк

При вставке строк применяются следующие правила.

  • Если значение загружается в столбцы с типом данных char, varchar или varbinary, то дополнение или усечение конечных пробелов (пробелы для char и varchar, нули для varbinary) определяет параметр SET ANSI_PADDING, определенный для столбца при создании таблицы. Дополнительные сведения см. в разделе SET ANSI_PADDING (Transact-SQL).
    В следующей таблице показаны операции по умолчанию для параметра SET ANSI_PADDING, установленного в значение OFF.

    Тип данных Стандартная операция

    char

    Заполнение значения пробелами до заданной ширины столбца.

    varchar

    Удаление конечных пробелов до последнего ненулевого символа или до одного пробела, если строка состоит только из пробелов.

    varbinary

    Удаление конечных нулей.

  • Если пустая строка ('') загружена в столбец с типом данных varchar или text, то операцией по умолчанию будет загрузка строки нулевой длины.

  • Если инструкция INSERT нарушает ограничение или правило или если в ней содержится значение, несовместимое с типом данных столбца, то инструкция не выполняется и компонент Database Engine выдает сообщение об ошибке.

  • Вставка значения NULL в столбец text или image не приводит ни к созданию допустимого текстового указателя, ни к предварительному распределению 8-килобайтной текстовой страницы. Дополнительные сведения о вставке данных text и image см. в разделе Применение функций типов данных text, ntext и image.

  • Если инструкция INSERT загружает несколько строк с помощью инструкций SELECT или EXECUTE, то любые нарушения правил или ограничений, возникающие из-за загружаемых значений, приводят к остановке выполнения всей инструкции, и ни одна из строк не будет загружена.

  • Если во время вставки значений в таблицы удаленного экземпляра компонента Database Engine указаны не все значения для всех столбцов, необходимо указать столбцы, в которые вставляются определенные значения.

Использование триггеров INSTEAD OF в операциях INSERT

Если триггер INSTEAD OF определен в операциях INSERT для таблицы или представления, то триггер выполняется вместо инструкции INSERT. Ранние версии SQL Server поддерживают только триггеры AFTER, определенные для инструкции INSERT и других инструкций, изменяющих данные. Дополнительные подробности о триггерах INSTEAD OF см. в разделе CREATE TRIGGER (Transact-SQL).

Вставка значений в столбцы определяемого пользователем типа

Вставлять значения в столбцы определяемого пользователем типа можно следующими способами.

  • Предоставление значения определяемого пользователем типа.

  • Предоставление значения типа системных данных SQL Server 2005 происходит, если определяемый пользователем тип поддерживает явное или неявное преобразование из этого типа. В следующем примере показано, как вставляются значения из столбца определяемого пользователем типа Point путем явного преобразования из строки.

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

    Двоичное значение также может предоставляться без выполнения явного преобразования, так как все определяемые пользователем типы могут быть неявно преобразованы из двоичного. Дополнительные сведения о преобразовании и определяемых пользователем типах данных см. в разделе Выполнение операций над пользовательскими типами данных.

  • Вызов пользовательской функции, которая возвращает значение определяемого пользователем типа. В следующих примерах используется определяемая пользователем функция CreateNewPoint() для создания новых значений определяемого пользователем типа Point и вставки значения в таблицу Cities.

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

Использование предложений OPENROWSET и BULK для массовой загрузки данных

В SQL Server 2005 Database Engine новые табличные подсказки, которые доступны с помощью массового поставщика набора строк OPENROWSET, позволяют производить следующие оптимизации массовой загрузки с помощью инструкции INSERT.

  • Ведение журнала массовой загрузки (минимизация числа записей в журнале для каждой операции вставки).
  • Проверка ограничений может быть установлена в ON или в OFF.
  • Выполнение триггера может быть установлено в ON или в OFF.

Эти оптимизации похожи на оптимизации, доступные для команды BULK INSERT.

Если инструкция INSERT выполняет массовую загрузку в непустую таблицу, то существуют следующие дополнительные методы улучшения производительности.

  • Если происходит разбиение страницы во время массовой загрузки, то добавляемые к странице новые строки протоколируются не полностью.
  • Если в таблице есть некластеризованные индексы, а кластеризованных индексов нет, то индивидуальные строки индекса могут быть запротоколированы полностью, но полного протоколирования строк данных не будет.

Дополнительные сведения см. в разделах OPENROWSET (Transact-SQL) и Табличная подсказка (Transact-SQL).

Разрешения

Требуется разрешение INSERT на целевую таблицу.

Разрешения INSERT предоставлены по умолчанию членам предопределенной роли сервера sysadmin, членам предопределенных ролей баз данных db_owner и db_datawriter и владельцу таблицы. Члены ролей sysadmin, db_owner и db_securityadmin, а также владелец таблицы могут предоставить разрешения другим пользователям.

Чтобы выполнить инструкцию INSERT с параметром BULK функции OPENROWSET, необходимо быть членом предопределенной роли сервера sysadmin или членом предопределенной роли сервера bulkadmin.

Примеры

A. Использование простой инструкции INSERT

В следующем примере в таблицу Production.UnitMeasure вставляется одна строка. Так как значения для всех столбцов предоставлены и перечислены в том же порядке, что и столбцы в таблице, то не нужно в параметре column_list. указывать имена столбцов.

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

Б. Вставка данных в порядке, отличном от порядка столбцов таблицы

В следующем примере используется параметр column_list для явного указания значений, которые будут вставляться в каждый столбец. В таблице UnitMeasure вначале идет столбец UnitMeasureCode, затем Name и ModifiedDate; однако столбцы в column_list перечислены в другом порядке.

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

C. Вставка данных с меньшим количеством значений, чем в столбцах

В следующем примере показана вставка строк в таблицу со столбцами, для которых автоматически создается значение или которые имеют значение по умолчанию. Инструкции INSERT вставляют строки, которые содержат значения для некоторых столбцов, но не для всех. В последней инструкции INSERT столбцы не указаны и вставляются только значения по умолчанию.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1 
(
    column_1 int IDENTITY, 
    column_2 varchar(30) 
        CONSTRAINT default_name DEFAULT ('my column default'),
    column_3 timestamp,
    column_4 varchar(40) NULL
);
GO
INSERT INTO dbo.T1 (column_4) 
    VALUES ('Explicit value');
INSERT INTO dbo.T1 (column_2, column_4) 
    VALUES ('Explicit value', 'Explicit value');
INSERT INTO dbo.T1 (column_2) 
    VALUES ('Explicit value');
INSERT INTO T1 DEFAULT VALUES; 
GO
SELECT column_1, column_2, column_3, column_4
FROM dbo.T1;
GO

Г. Вставка данных в таблицу со столбцом идентификаторов

В следующем примере показаны различные методы вставки данных в столбец идентификаторов. Первые две инструкции INSERT позволяют создать значения идентификаторов для новых строк. Третья инструкция INSERT переопределяет свойство IDENTITY столбца с помощью инструкции SET IDENTITY_INSERT и вставляет явно заданное значение в столбец идентификаторов.

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

Д. Вставка данных в столбец уникального идентификатора с помощью функции NEWID()

В следующем примере используется функция NEWID(), чтобы получить идентификатор GUID для столбца column_2. В отличие от столбцов идентификаторов, компонент Database Engine не создает автоматически значения для столбцов с типом данных uniqueidentifier, как показано во второй инструкции INSERT.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1 
(
    column_1 int IDENTITY, 
    column_2 uniqueidentifier,
);
GO
INSERT INTO dbo.T1 (column_2) 
    VALUES (NEWID());
INSERT INTO T1 DEFAULT VALUES; 
GO
SELECT column_1, column_2
FROM dbo.T1;
GO

Е. Вставка данных в таблицу через представление

В следующем примере в инструкции INSERT определяется имя представления; новая строка вставляется в базовую таблицу представления. Порядок следования значений в списке VALUES инструкции INSERT должен совпадать с порядком следования столбцов в представлении.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
IF OBJECT_ID ('dbo.V1', 'V') IS NOT NULL
    DROP VIEW dbo.V1;
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30));
GO
CREATE VIEW V1 AS 
SELECT column_2, column_1 
FROM T1;
GO
INSERT INTO V1 
    VALUES ('Row 1',1);
GO
SELECT column_1, column_2 
FROM T1;
GO
SELECT column_1, column_2
FROM V1;
GO

Ж. Вставка данных с помощью параметров SELECT и EXECUTE

В следующем примере показаны три различных метода получения данных из одной таблицы и вставки их в другую. Каждый метод основан на многотабличной инструкции SELECT, содержащей выражение и литеральное значение в списке столбцов.

Первая инструкция INSERT напрямую использует инструкцию SELECT для получения данных из исходных таблиц (Employee, SalesPerson и Contact) и сохранения результирующего набора в таблице EmployeeSales. Вторая инструкция INSERT выполняет хранимую процедуру, содержащую инструкцию SELECT, а третья инструкция INSERT выполняет инструкцию SELECT как литеральную строку.

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

З. Вставка данных с помощью предложения TOP

В следующем примере создается таблица NewEmployee и данные об адресах десяти верхних сотрудников вставляются в нее из таблицы Employee. Затем выполняется проверка содержимого таблицы NewEmployee с помощью инструкции SELECT.

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

И. Использование предложения OUTPUT с инструкцией INSERT

В следующем примере производится вставка строки в таблицу ScrapReason, а затем при помощи предложения OUTPUT результаты выполнения инструкции возвращаются в переменную @MyTableVartable. Так как столбец ScrapReasonID определен с помощью свойства IDENTITY, то значение для этого столбца не указано в инструкции INSERT. Однако следует заметить, что значение, созданное компонентом Database Engine для этого столбца, возвращается в предложении OUTPUT в столбец INSERTED.ScrapReasonID.

USE AdventureWorks;
GO
DECLARE @MyTableVar table( ScrapReasonID smallint,
                           Name varchar(50),
                           ModifiedDate datetime);
INSERT Production.ScrapReason
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
        INTO @MyTableVar
VALUES (N'Operator error', GETDATE());

--Display the result set of the table variable.
SELECT ScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate 
FROM Production.ScrapReason;
GO

К. Использование обобщенного табличного выражения WITH с инструкцией INSERT

В следующем примере создается таблица NewEmployee. Обобщенное табличное выражение (EmployeeTemp) определяет строки, которые вставляются в таблицу NewEmployee. Инструкция INSERT ссылается на столбцы в обобщенном табличном выражении.

USE AdventureWorks;
GO
IF OBJECT_ID (N'HumanResources.NewEmployee', N'U') IS NOT NULL
    DROP TABLE HumanResources.NewEmployee;
GO
CREATE TABLE HumanResources.NewEmployee
(
    EmployeeID int NOT NULL,
    LastName nvarchar(50) NOT NULL,
    FirstName nvarchar(50) NOT NULL,
    Phone Phone NULL,
    AddressLine1 nvarchar(60) NOT NULL,
    City nvarchar(30) NOT NULL,
    State nchar(3) NOT NULL, 
    PostalCode nvarchar(15) NOT NULL,
    CurrentFlag Flag
);
GO
WITH EmployeeTemp (EmpID, LastName, FirstName, Phone, 
                   Address, City, StateProvince, 
                   PostalCode, CurrentFlag)
AS (SELECT 
        e.EmployeeID, c.LastName, c.FirstName, c.Phone,
        a.AddressLine1, a.City, sp.StateProvinceCode, 
        a.PostalCode, e.CurrentFlag
    FROM HumanResources.Employee e
        INNER JOIN HumanResources.EmployeeAddress AS ea
        ON e.EmployeeID = ea.EmployeeID
        INNER JOIN Person.Address AS a
        ON ea.AddressID = a.AddressID
        INNER JOIN Person.StateProvince AS sp
        ON a.StateProvinceID = sp.StateProvinceID
        INNER JOIN Person.Contact as c
        ON e.ContactID = c.ContactID
    )
INSERT INTO HumanResources.NewEmployee 
    SELECT EmpID, LastName, FirstName, Phone, 
           Address, City, StateProvince, PostalCode, CurrentFlag
    FROM EmployeeTemp;
GO

Л. Использование предложения OUTPUT со столбцами идентификаторов и вычисляемыми столбцами

В следующем примере создается таблица EmployeeSales, а затем в нее с помощью инструкции INSERT вставляется несколько строк, получаемых инструкцией SELECT из исходных таблиц. Таблица EmployeeSales содержит столбец идентификаторов (EmployeeID) и вычисляемый столбец (ProjectedSales). Поскольку эти значения создаются компонентом Database Engine при вставке, ни один из этих столбцов нельзя задавать в @MyTableVar.

USE AdventureWorks ;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
    DROP TABLE dbo.EmployeeSales;
GO
CREATE TABLE dbo.EmployeeSales
( EmployeeID   int IDENTITY (1,5)NOT NULL,
  LastName     nvarchar(20) NOT NULL,
  FirstName    nvarchar(20) NOT NULL,
  CurrentSales money NOT NULL,
  ProjectedSales AS CurrentSales * 1.10 
);
GO
DECLARE @MyTableVar table(
  LastName     nvarchar(20) NOT NULL,
  FirstName    nvarchar(20) NOT NULL,
  CurrentSales money NOT NULL
  );

INSERT INTO dbo.EmployeeSales (LastName, FirstName, CurrentSales)
  OUTPUT INSERTED.LastName, 
         INSERTED.FirstName, 
         INSERTED.CurrentSales
  INTO @MyTableVar
    SELECT c.LastName, c.FirstName, sp.SalesYTD
    FROM HumanResources.Employee AS e
        INNER JOIN Sales.SalesPerson AS sp
        ON e.EmployeeID = sp.SalesPersonID 
        INNER JOIN Person.Contact AS c
        ON e.ContactID = c.ContactID
    WHERE e.EmployeeID LIKE '2%'
    ORDER BY c.LastName, c.FirstName;

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

См. также

Справочник

BULK INSERT (Transact-SQL)
CREATE TABLE (Transact-SQL)
DELETE (Transact-SQL)
EXECUTE (Transact-SQL)
FROM (Transact-SQL)
IDENTITY (свойство) (Transact-SQL)
NEWID (Transact-SQL)
SELECT (Transact-SQL)
SET ROWCOUNT (Transact-SQL)
UPDATE (Transact-SQL)

Другие ресурсы

Вставка данных в таблицу

Справка и поддержка

Получение помощи по SQL Server 2005