SQL Server UpSert

SQL Server UpSert

No SQL Server, uma operação "UpSert" combina as ações de uma inserção e uma instrução de atualização em uma única instrução. Esta operação insere uma nova linha em uma tabela se essa linha não estiver presente. Caso contrário, ele atualiza uma linha já presente. O benefício de executar uma operação de upsert é que ela elimina a necessidade de declarações de inserção e atualização separadas, simplificando seu código SQL e reduzindo a probabilidade de erros.

Criando uma tabela

Vamos criar uma tabela no servidor SQL que possamos usar para executar as operações de upsert em.

Criar tabela [DBO].[Funcionário](
[Empid] [smallint] não nulo,
[Nome] [Nvarchar] (50) Não NULL,
[Depid] [SmallInt] NULL,
[Sal] [int] nulo
)
Inserir em [DBO].[Funcionário] ([empid], [nome], [depid], [sal])
Valores
(1, 'Moumita', 5, 50000),
(2, 'Orijit', 2, 30000),
(3, 'somdeb', 5, 60000),
(4, 'Rocky', 2, 50000),
Selecione * de [DBO].[Funcionário];

Saída:

Empid name depid sal
1 Moumita 5 50000
2 Orijit 2 30000
3 SOMDEB 5 60000
4 Rocky 2 50000

Maneiras de executar a operação UpSert

Existem várias maneiras de executar uma operação de upsert no servidor SQL. Neste artigo, discutiremos os três métodos comuns para executar uma operação de upsert: usando a cláusula existe, a função RowCount e a declaração de mesclagem.

1. Usando a cláusula existe

Este método envolve o uso de uma subconsulta para verificar se a linha já existe na tabela antes de executar uma instrução de inserção ou atualização. A cláusula existe retorna true se a subconsulta retornar alguma linha.

Comece a transação
declarar @employeeid int = 17;
declarar @name varchar (max) = 'bidisha';
Se existe (selecione * do DBO.Funcionário com (updlock, serializável)
onde empid = @employeid)
Atualizar DBO.Funcionário
Set Name = @Name
Onde empid = @employeid
OUTRO
Insira no DBO.Funcionário (empid, nome)
Valores
(@Employeeid, @Name)
Comprometer transação;

Saída:

Empid name depid sal
17 bidisha nulo nulo

Aqui, o código SQL usa o método existe para executar uma operação UpSert no servidor SQL. Inicia uma transação e declara as variáveis ​​para manter os valores de identificação e nome do funcionário. O código verifica se existe um registro com o ID do funcionário especificado na tabela usando a cláusula exist. Se existir, atualiza o nome do funcionário para um novo valor. Caso contrário, ele insere uma nova linha com o ID e o nome do funcionário fornecido.

2. Usando a função RowCount

Este método envolve a execução de uma declaração de atualização primeiro, seguida de uma instrução de inserção se a declaração de atualização não atualizou nenhuma linhas.

Comece a transação
declarar @employeeid int = 18;
declarar @name varchar (max) = 'sonalika';
Atualizar DBO.Funcionário com (updlock, serializável)
Set Name = @Name
Onde empid = @employeid
Se @@ RowCount = 0
Insira no DBO.Funcionário (empid, nome)
Valores
(@Employeeid, @Name)
Comprometer transação;

Saída:

Empid name depid sal
18 sonalika nulo nulo

Aqui, o código SQL tenta atualizar o nome do funcionário com o ID fornecido na tabela usando o updlock e dicas serializáveis ​​que adquirem um bloqueio exclusivo na linha selecionada. Se a atualização não afetar as linhas, o código executará uma instrução Insert para inserir uma nova linha com o ID do funcionário e os valores do nome do funcionário.

3. Usando a declaração de mesclagem

Uma terceira maneira de executar uma operação de upsert no servidor SQL é aplicar a instrução MERGE. Este método combina as ações das instruções de inserção e atualização em uma única declaração, semelhante à cláusula existe, mas com recursos mais avançados.

declarar @employeeid int = 18;
declarar @name varchar (max) = 'arnab';
Mesclar DBO.Funcionário com (holdlock) como alvo
Usando (valores (@employeeId, @Name)) como fonte (EmployeeID, nome)
No alvo.Empid = fonte.ID do Empregado
Quando correspondido, atualize o Definir Target.Nome = fonte.Nome
Quando não foi correspondido, insira os valores (empid, nome) (fonte.Funcionário, fonte.Nome);

Saída:

Empid name depid sal
18 arnab nulo nulo

Esta consulta SQL usa a declaração de mesclagem para mesclar os dados de uma tabela de origem em uma tabela de destino. Ele corresponde às linhas entre as duas tabelas usando a "coluna empid" e atualiza a "coluna de nome" na tabela de destino se uma correspondência for encontrada. Se não houver correspondência, ele insere uma nova linha.

Conclusão

As operações UpSert são um requisito comum no servidor SQL. Existem várias maneiras de alcançá -los, incluindo o uso do método exist, a função RowCount e a declaração de mesclagem. Podemos escolher a melhor abordagem com base em nosso requisito.