Estou tentando inserir/atualizar dados para a tabela T1 (int id, char name, float data), que possui um índice exclusivo em id
e name
.
Estou usando SQLBulkOperation(SQL_ADD)
para adicionar registros à tabela e SQLBulkOperation(SQL_UPDATE_BY_BOOKMARK)
atualizá-los.
Agora meu caso de uso é que eu tenho que atualizar registros se eles já existirem e inserir se não existirem. Para isso, o MySQL fornece INSERT INTO ... ON DUPLICATE KEY UPDATE
.
Como implementar o mesmo no SQL Server? Existe alguma outra maneira eficiente de fazer isso?
Estou usando libmsodbcsql-13.0.so.0.0
para me conectar ao SQL Server.
A
MERGE
declaração, introduzida no SQL Server 2008, seria a recomendação usual aqui. É um recurso que parece bastante subutilizado (no meu caso porque até recentemente eu tive que dar suporte ao SQL Server 2005), mas bastante poderoso.Consulte:
https://learn.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql
https://technet.microsoft.com/en-us/library/bb522522(v=sql .105).aspx
Há uma série de problemas a serem cuidadosos em relação à simultaneidade (o
MERGE
próprio impasse (!)), desempenho, consistência de chave e outros bugs:https://www.mssqltips.com/sqlservertip/3074/use-caution- with-sql-servers-merge-statement/
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/73d2b0de-d6cc-4938-a303-b24d59c1be54/deadlock-on-simple-merge-statement? forum=sqlgetstarted
https://sqlperformance.com/2013/02/t-sql-queries/another-merge-bug
A alternativa é usar um processo de várias etapas (excluir o que não é mais necessário, atualizar o que já está presente, inserir o que está faltando) envolvido em uma transação com as configurações apropriadas.