11 de outubro de 2009

Sintaxe do comando INSERT no SQL Server

Por ser parte integrante de uma das 4 operações básicas de uma aplicação que trabalhe com Banco de dados (Incluir, Atualizar, Excluir e Consultar) o comando SQL INSERT é imprescindível neste cenário. Os exemplos que vou mostrar aqui foram montados com o SQL Server da Microsoft mas uma parte deles deve funcionar com outros Gerenciadores de Banco de Dados.

Provavelmente, a sintaxe mais usada desse comando é a que permite a inclusão de um único registro numa tabela. Considere a tabela criada com o comando abaixo:
-- Em SQL Server
create table INFO
(
ID int not null,
VALOR numeric(15,4) null,
DESCRICAO varchar(255) null,
DATA smalldatetime null
)

Para incluir um único registro com valores fixos, a sintaxe básica pede as palavras chaves INSERT INTO seguidas pelo nome da tabela, a palavra VALUES e, entre parênteses, a lista dos valores para cada campo separados por vírgula. Um exemplo com a tabela descrita acima:
INSERT INTO INFO
VALUES (10, NULL, 'Texto da descrição', '20091009')

Os valores para colunas que sejam do tipo texto (Varchar) ou do tipo data devem ser envolvidos em aspas simples. A ordem em que os valores devem ser colocados segue exatamente a mesma ordem com que os colunas foram declaradas na criação da tabela; com essa sintaxe básica, todas as colunas devem ter um valor associado no VALUES. As colunas que foram marcadas na criação da tabela com as palavras NOT NULL são obrigatórias, isto é, não posso passar NULL no lugar do valor reservado para elas.

Para uma tabela com muitas colunas, essa sintaxe é bastante trabalhosa, já que um valor para cada coluna deve ser providenciado, e na ordem correta. Neste caso, há uma variação da sintaxe básica que pode ser útil pois permite que selecionemos quais as colunas que serão alimentadas pelo comando, restringindo a quantidade de informações àquelas colunas que forem realmente necessárias na inclusão. Para isso, basta criar após o nome da tabela uma lista entre parênteses com os nomes das colunas separadas por vírgula. A ordem das colunas nessa lista é irrelevante mas a lista com os valores a inserir deve respeitar a ordem estabelecida.
INSERT INTO INFO
(ID, DESCRICAO)
VALUES
(10, 'Texto da descrição')

As colunas que forem omitidas no comando serão inseridas com valor NULL. Por isso, todas as colunas declaradas com NOT NULL devem ser informadas, caso contrário um erro será reportado e o registro não será incluído. Na tabela usada como exemplo, apenas a coluna ID é obrigatória com essa sintaxe.

E para o caso de querer popular a tabela com valores lidos de outra tabela ? Na verdade, há uma variação da sintaxe do INSERT que permite informar uma cláusula SELECT completa. Então, a origem dos dados pode ser uma única tabela, um JOIN entre tabelas ou mesmo de uma visão (VIEW) que tenha sido criada no banco de dados. Para esse resultado, basta substituir a cláusula VALUES e sua lista de valores pelo SELECT desejado.
INSERT INTO INFO (ID, DESCRICAO, VALOR)
SELECT ID_INFO, 'Texto da descrição', VLR_TRANS
FROM INFOTRANS
WHERE ID_INFO > 100

Mais uma vez, a ordem e o tipo das colunas retornadas no SELECT devem respeitar a sequência de colunas conforme estabelecido no próprio comando, como no exemplo. Caso essa sequencia seja omitida, novamente passa a valer a ordem de declaração das colunas quando a tabela foi criada.

Veja também que o comando SELECT montado trás misturado valores de colunas e valores fixos. Poderiam ter sido usadas também funções do SQL Server ou qualquer outra expressão válida. Em todas essas situações, os tipos de dado das colunas no SELECT devem ser compatíveis com os tipos das colunas que vão ser inseridas. Como resultado do INSERT deste exemplo, podem ser incluidos vários registros de uma vez só - será um registro na tabela INFO para cada registro retornado pelo SELECT.

O SQL Server permite que você informe o nome completo de uma tabela ao montar uma cláusula SELECT, isto é, você pode dizer qual é o nome do banco de dados onde a tabela está e o nome do "Owner" da tabela. Na prática, isso possibilita, por exemplo, a cópia de registros de uma base de testes para a base de Produção.
INSERT INTO INFO (ID, DESCRICAO, VALOR)
SELECT ID, DESCRICAO, VALOR
FROM BASETESTES.dbo.INFO

Se o banco de dados onde o SELECT será submetido estiver em um computador (Servidor de banco de dados) diferente daquele onde você vai executar o comando INSERT, deve ser usada a função OPENDATASOURCE, que existe desde a versão 2000 do SQL Server. Ela é necessária por causa da política de segurança, isto é, você provavelmente vai ter que fornecer um usuário e senha para poder se conectar nesse servidor remoto antes de conseguir extrair dados dele.

Um comentário :

Anônimo disse...

Bom dia Luís Gustavo Fabbro.
Gostei muito das suas informações, principalmente a questão sobre popular uma tabela através de outra.
Abraços.

Postar um comentário

OBS: Os comentários enviados a este Blog são submetidos a moderação. Por isso, eles serão publicados somente após aprovação.

Observação: somente um membro deste blog pode postar um comentário.