Inserir dados

Concluído

Transact-SQL possibilita diversas formas de inserir linhas em uma tabela.

Instrução INSERT

A instrução INSERT é usada para adicionar uma ou mais linhas a uma tabela. Essa instrução possui várias formas.

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 essa forma da instrução INSERT, chamada INSERT VALUES, você pode especificar as colunas nas quais serão inseridos valores e a ordem na qual os dados serão apresentados para cada linha inserida na tabela. A lista de colunas é opcional, porém recomendada. Sem a lista de colunas, a instrução INSERT esperará um valor para cada coluna na 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írgulas.

Ao listar valores, a palavra-chave DEFAULT significa que será usado um valor predefinido, que foi especificado quando a tabela foi criada. Há três maneiras pelas quais um default pode ser determinado:

  • Se uma coluna tiver sido definida para ter um valor gerado automaticamente, esse valor será usado. Este tópico será discutido posteriormente 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 NULOs e a coluna não for uma coluna gerada automaticamente e não tiver um padrão definido, o valor NULO será inserido como PADRÃO.

Os detalhes da criação de tabelas estão além do escopo deste módulo. No entanto, geralmente é útil ver que colunas estão presentes 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 possa ser VERDADEIRA, nenhuma linha pode ser retornada.

SELECT * FROM Sales.Promotion
WHERE 1 = 0;

Essa instrução mostrará todas as colunas e seus nomes, mas não mostrará os tipos de dados ou as propriedades, como se os NULOs são permitidos ou se há valores padrão especificados. Um exemplo da saída da consulta pode ter a seguinte aparência:

PromotionName

StartDate

ProductModelID

Desconto

Observações

Para inserir dados nessa tabela, você pode usar a instrução INSERT, como 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, pois 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 modo que um valor padrão da data atual seja aplicado à coluna StartDate, e que a coluna Notes permita valores NULOs. 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. Nesse caso, o valor padrão será usado, caso definido, e, se não houver um valor padrão, mas a coluna permitir NULOS, um NULO será inserido. Se você não estiver fornecendo valores para todas as colunas, você deverá ter uma lista de colunas indicando que 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 por vez, a instrução INSERT VALUES pode ser usada para inserir várias linhas, fornecendo-se vários conjuntos de valores separados por vírgula. Os conjuntos de valores também são separados por vírgulas, desta forma:

(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)

Essa 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);

INSERT…SELECT

Além de especificar um conjunto literal de valores em uma instrução INSERT, o T-SQL também permite o 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 esse 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>...;

Observação

Conjuntos de resultados de procedimentos armazenados (ou até mesmo lotes dinâmicos) também podem ser usados como entrada para uma instrução INSERT. Essa 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 ter 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 contenha "quadro" 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 INSERT não é incluído entre parênteses.

SELECT … INTO

Outra opção para inserir linhas, 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, pois sempre cria uma nova tabela baseada no resultado do SELECT. Cada coluna na nova tabela terá o mesmo nome, tipo de dados e nulidade como a coluna (ou expressão) correspondente na lista SELECT.

Para usar SELECT INTO, adicione INTO <nome_da_nova_tabela> na cláusula SELECT da consulta, logo antes da cláusula FROM. Aqui está um exemplo que extrai dados da tabela Sales. SalesOrderHeader para uma nova tabela chamada Sales.Invoice.

SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;

Um SELECT INTO falhará se já houver uma tabela com o nome especificado depois de INTO. Depois que a tabela é criada, ela pode ser tratada como qualquer outra tabela. Você pode selecionar a partir dela, associá-la a outras tabelas ou inserir mais linhas nela.