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).
Важно! Возможность указать подсказки 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
результаты выполнения инструкции возвращаются в переменную @MyTableVar
table. Так как столбец 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)