Вставка данных
Transact-SQL предоставляет несколько способов вставки строк в таблицу.
Инструкция INSERT
Инструкция INSERT используется для добавления в таблицу одной или нескольких строк. Существует несколько форм инструкции.
Ниже показан базовый синтаксис простой инструкции INSERT.
INSERT [INTO] <Table> [(column_list)]
VALUES ([ColumnName or an expression or DEFAULT or NULL],…n)
С помощью этой формы инструкции INSERT, которая называется INSERT VALUES, вы можете указывать столбцы, в которых будут размещены значения, а также порядок представления данных для каждой строки, вставляемой в таблицу. Использовать атрибут column_list необязательно, однако это действие является рекомендуемым. Без column_list инструкция INSERT будет ожидать значения для каждого столбца таблицы в том порядке, в котором столбцы были определены. Значения для этих столбцов можно также предоставить в виде списка, разделенного запятыми.
При перечислении значений ключевое слово DEFAULT означает, что будет использоваться стандартное значение, которое было указано при создании таблицы. Существует три способа определения значения по умолчанию.
- Если определено, что значение для столбца будет создаваться автоматически, будет использоваться это значение. Автоматически создаваемые значения будут рассмотрены далее в этом модуле.
- При создании таблицы для столбца можно задать значение по умолчанию. Это значение также будет использоваться, если задано значение DEFAULT.
- Если столбец был определен для разрешения значений NULL, он не является автоматически сформированным и для него не определено значение по умолчанию, в качестве значения DEFAULT будет задано значение NULL.
Сведения о создании таблиц выходят за рамки данного модуля. Однако зачастую вам могут быть очень полезны сведения о том, какие столбцы находятся в таблице. Самый простой способ — выполнить инструкцию SELECT для таблицы, не возвращая строки. При использовании условия WHERE, которое не может иметь значение TRUE, возвращение строк невозможно.
SELECT * FROM Sales.Promotion
WHERE 1 = 0;
После выполнения этой инструкции будут показаны все столбцы и их имена, но не будут отображаться типы данных и свойства, например то, разрешены ли значения NULL или задано ли значение по умолчанию. Пример выходных данных запроса может выглядеть следующим образом:
НазваниеАкции
StartDate
ИДМоделиПродукта
Discount
Примечания.
Чтобы вставить данные в эту таблицу, можно использовать инструкцию INSERT, как показано здесь.
INSERT INTO Sales.Promotion (PromotionName,StartDate,ProductModelID,Discount,Notes)
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');
В приведенном примере список столбцов можно опустить, поскольку мы предоставляем значение для каждого столбца в правильном порядке:
INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');
Предположим, что таблица определена таким образом, что к столбцу StartDate применяется значение по умолчанию "Текущая дата", а в столбце Примечания допускаются значения NULL. Вы можете явно указать, что хотите использовать эти значения, например, как показано ниже:
INSERT INTO Sales.Promotion
VALUES
('Pull your socks up', DEFAULT, 24, 0.25, NULL);
Кроме того, вы можете опустить значения в инструкции INSERT. В этом случае будет использоваться значение по умолчанию, а если значение по умолчанию отсутствует, но в столбце разрешены значения NULL, будет вставлено значение NULL. Если вы не будете предоставлять значения для всех столбцов, то в списке столбцов должно быть указано, для каких столбцов значения не установлены.
INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount)
VALUES
('Caps Locked', 2, 0.2);
Кроме вставки одной строки за раз, инструкцию INSERT VALUES можно использовать для вставки нескольких строк, предоставляя несколько наборов значений, разделенных запятыми. Наборы значений также разделяются запятыми следующим образом:
(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)
Этот список значений называется конструктором значений таблицы. Ниже приведен пример вставки двух дополнительных строк в таблицу с помощью конструктора значений таблицы:
INSERT INTO Sales.Promotion
VALUES
('The gloves are off!', DEFAULT, 3, 0.25, NULL),
('The gloves are off!', DEFAULT, 4, 0.25, NULL);
INSERT … SELECT
Помимо указания литерального набора значений в инструкции INSERT, T-SQL поддерживает использование результатов других операций для предоставления значений для INSERT. Следовательно, вы можете использовать результаты инструкции SELECT или выходных данных хранимой процедуры, чтобы предоставить значения для инструкции INSERT.
Чтобы использовать инструкцию INSERT с вложенной инструкцией SELECT, создайте инструкцию SELECT для замены предложения VALUES. Используя эту форму, которая называется INSERT SELECT, в целевую таблицу можно вставить набор строк, возвращенных запросом SELECT. Во время использования инструкции INSERT SELECT возникают те же особенности, что и при использовании INSERT VALUES:
- При необходимости после имени таблицы можно указать список столбцов.
- Для каждого столбца необходимо указать значения, то есть DEFAULT или NULL.
Следующий синтаксис иллюстрирует использование инструкции INSERT SELECT:
INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;
Примечание.
В качестве входных данных для инструкции INSERT можно использовать результирующие наборы из хранимых процедур (или даже динамических пакетов). Такая форма инструкции INSERT, называемая INSERT EXEC, концептуально напоминает инструкцию INSERT SELECT и будет представлять те же особенности. Однако при использовании этой инструкции хранимые процедуры могут возвращать несколько результирующих наборов, поэтому нужно быть особенно внимательным.
В следующем примере показано, как вставить несколько строк для новой рекламной акции с именем Get Framed (Получение кадров), извлекая идентификатор модели и имя модели из таблицы Production.ProductModel для каждой модели, в имени которой указано слово frame.
INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount, Notes)
SELECT DISTINCT 'Get Framed', m.ProductModelID, 0.1, '10% off ' + m.Name
FROM Production.ProductModel AS m
WHERE m.Name LIKE '%frame%';
В отличие от подзапроса, при использовании с INSERT вложенную инструкцию SELECT не нужно заключать в скобки.
SELECT ... INTO
Другой вариант вставки строк, похожий на инструкцию INSERT SELECT, — это инструкция SELECT INTO. Важнейшим различием между инструкциями INSERT SELECT и SELECT INTO является то, что инструкцию SELECT INTO нельзя использовать для вставки строк в существующую таблицу, так как она всегда создает новую таблицу на основе результата выполнения инструкции SELECT. Каждый столбец в новой таблице будет иметь те же имя, тип данных и допустимость значений NULL, что и соответствующий столбец (или выражение) в списке инструкции SELECT.
Чтобы использовать SELECT INTO, добавьте INTO <имя_новой_таблицы> в предложение SELECT запроса непосредственно перед предложением FROM. Ниже приведен пример, в котором данные извлекаются из таблицы Sales.SalesOrderHeader в новую таблицу с именем Sales.Invoice.
SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;
Если таблица с именем, указанным после INTO, уже есть, выполнение SELECT INTO завершится ошибкой. После создания таблицу можно использовать как и любую другую таблицу. Вы можете выбирать из нее данные, соединять ее с другими таблицами или вставлять в нее дополнительные строки.