Inserir dados
O Transact-SQL fornece várias maneiras de inserir linhas em uma tabela.
A instrução INSERT
A instrução INSERT é usada para adicionar uma ou mais linhas a uma tabela. Existem várias formas da declaração.
A sintaxe básica de uma instrução INSERT simples é mostrada abaixo:
INSERT [INTO] <Table> [(column_list)]
VALUES ([ColumnName or an expression or DEFAULT or NULL],…n)
Com esta forma da instrução INSERT, chamada INSERT VALUES, você pode especificar as colunas que terão valores colocados nelas e a ordem em que os dados serão apresentados para cada linha inserida na tabela. O column_list é opcional, mas recomendado. Sem o column_list, a instrução INSERT esperará um valor para cada coluna da tabela na ordem em que as colunas foram definidas. Você também pode fornecer os valores para essas colunas como uma lista separada por vírgula.
Ao listar valores, a palavra-chave DEFAULT significa que um valor predefinido, que foi especificado quando a tabela foi criada, será usado. Há três maneiras de determinar um padrão:
- Se uma coluna tiver sido definida para ter um valor gerado automaticamente, esse valor será usado. Os valores gerados automaticamente serão discutidos mais adiante neste módulo.
- Quando uma tabela é criada, um valor padrão pode ser fornecido para uma coluna, e esse valor será usado se DEFAULT for especificado.
- Se uma coluna tiver sido definida para permitir valores NULL e a coluna não for uma coluna gerada automaticamente e não tiver um padrão definido, NULL será inserido como DEFAULT.
Os detalhes da criação de tabelas estão além do escopo deste módulo. No entanto, muitas vezes é útil ver quais colunas estão em uma tabela. A maneira mais fácil é apenas executar uma instrução SELECT na tabela sem retornar nenhuma linha. Usando uma condição WHERE que nunca pode ser TRUE, nenhuma linha pode ser retornada.
SELECT * FROM Sales.Promotion
WHERE 1 = 0;
Esta instrução mostrará todas as colunas e seus nomes, mas não mostrará os tipos de dados ou quaisquer propriedades, como se NULLs são permitidos ou se há valores padrão especificados. Um exemplo da saída da consulta pode ter esta aparência:
PromotionName
StartDate
ID do Modelo do Produto
Discount
Notas
Para inserir dados nesta tabela, você pode usar a instrução INSERT conforme mostrado aqui.
INSERT INTO Sales.Promotion (PromotionName,StartDate,ProductModelID,Discount,Notes)
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');
Para este exemplo acima, a lista de colunas pode ser omitida, porque estamos fornecendo um valor para cada coluna na ordem correta:
INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');
Suponha que a tabela seja definida de forma que um valor padrão da data atual seja aplicado à coluna StartDate e a coluna Notes permita valores NULL. Você pode indicar que deseja usar esses valores explicitamente, desta forma:
INSERT INTO Sales.Promotion
VALUES
('Pull your socks up', DEFAULT, 24, 0.25, NULL);
Como alternativa, você pode omitir valores na instrução INSERT, caso em que o valor padrão será usado se definido, e se não houver nenhum valor padrão, mas a coluna permitir NULLs, um NULL será inserido. Se você não estiver fornecendo valores para todas as colunas, deverá ter uma lista de colunas indicando quais valores de coluna você está fornecendo.
INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount)
VALUES
('Caps Locked', 2, 0.2);
Além de inserir uma única linha de cada vez, a instrução INSERT VALUES pode ser usada para inserir várias linhas fornecendo vários conjuntos de valores separados por vírgula. Os conjuntos de valores também são separados por vírgulas, assim:
(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)
Esta lista de valores é conhecida como um construtor de valor de tabela. Aqui está um exemplo de inserção de mais duas linhas em nossa tabela com um construtor de valor de tabela:
INSERT INTO Sales.Promotion
VALUES
('The gloves are off!', DEFAULT, 3, 0.25, NULL),
('The gloves are off!', DEFAULT, 4, 0.25, NULL);
INSERIR ... SELECIONAR
Além de especificar um conjunto literal de valores em uma instrução INSERT, o T-SQL também oferece suporte ao uso dos resultados de outras operações para fornecer valores para INSERT. Você pode usar os resultados de uma instrução SELECT ou a saída de um procedimento armazenado para fornecer os valores para a instrução INSERT.
Para usar INSERT com um SELECT aninhado, crie uma instrução SELECT para substituir a cláusula VALUES. Com este formulário, chamado INSERT SELECT, você pode inserir o conjunto de linhas retornadas por uma consulta SELECT em uma tabela de destino. O uso de INSERT SELECT apresenta as mesmas considerações que INSERT VALUES:
- Opcionalmente, você pode especificar uma lista de colunas após o nome da tabela.
- Você deve fornecer valores de coluna ou DEFAULT, ou NULL, para cada coluna.
A sintaxe a seguir ilustra o uso de INSERT SELECT:
INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;
Nota
Conjuntos de resultados de procedimentos armazenados (ou mesmo lotes dinâmicos) também podem ser usados como entrada para uma instrução INSERT. Esta forma de INSERT, chamada INSERT EXEC, é conceitualmente semelhante a INSERT SELECT e apresentará as mesmas considerações. No entanto, os procedimentos armazenados podem retornar vários conjuntos de resultados, portanto, é necessário cuidado extra.
O exemplo a seguir insere várias linhas para uma nova promoção chamada Get Framed recuperando a ID do modelo e o nome do modelo da tabela Production.ProductModel, para cada modelo que contém "frame" em seu nome.
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%';
Ao contrário de uma subconsulta, o SELECT aninhado usado com um INSERT não está entre parênteses.
SELECIONE ... EM
Outra opção para inserir linhas, que é semelhante a INSERT SELECT, é a instrução SELECT INTO. A maior diferença entre INSERT SELECT e SELECT INTO é que SELECT INTO não pode ser usado para inserir linhas em uma tabela existente, porque ele sempre cria uma nova tabela baseada no resultado do SELECT. Cada coluna na nova tabela terá o mesmo nome, tipo de dados e anulabilidade que a coluna (ou expressão) correspondente na lista SELECT.
Para usar SELECT INTO, adicione INTO <new_table_name> na cláusula SELECT da consulta, imediatamente antes da cláusula FROM. Este é um exemplo que extrai dados da tabela Sales.SalesOrderHeader em uma nova tabela chamada Sales.Invoice..
SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;
A SELECT INTO falhará se já existir uma tabela com o nome especificado após INTO. Depois que a tabela é criada, ela pode ser tratada como qualquer outra tabela. Você pode selecioná-lo, associá-lo a outras tabelas ou inserir mais linhas nele.