No SQL Server é possível obter o “id” de um registro quando o Insert é executado?
-
09-06-2019 - |
Pergunta
No SQL Server 2005, tenho um campo "id" em uma tabela que possui a propriedade "Is Identity" definida como 'Sim'.Portanto, quando um Insert é executado nessa tabela, o "id" é definido automaticamente para o próximo número inteiro incrementado.Existe uma maneira fácil de executar o Insert para obter o que o "id" foi definido sem ter que fazer uma instrução Select logo após o Insert?
duplicata de:
Melhor maneira de obter a identidade da linha inserida?
Solução
Pelo menos no .Net, você pode enviar várias consultas ao servidor de uma só vez.Eu faço isso no meu aplicativo:
command.CommandText = "INSERT INTO [Employee] (Name) VALUES (@Name); SELECT SCOPE_IDENTITY()";
int id = (int)command.ExecuteScalar();
Funciona como um encanto.
Outras dicas
Se você estiver inserindo várias linhas, o uso do OUTPUT
e INSERTED.columnname
cláusula sobre o insert
declaração é uma maneira simples de colocar todos os ids em uma tabela temporária.
DECLARE @MyTableVar table( ID int,
Name varchar(50),
ModifiedDate datetime);
INSERT MyTable
OUTPUT INSERTED.ID, INSERTED.Name, INSERTED.ModifiedDate INTO @MyTableVar
SELECT someName, GetDate() from SomeTable
Scope_identity() é a forma preferida, veja: 6 maneiras diferentes de obter o valor atual da identidade
SCOPE_IDENTITY();é sua melhor aposta.E se você estiver usando .NET basta passar um parâmetro nosso e verificar o valor após a execução do procedimento.
CREATE PROCEDURE [dbo].[InsertProducts]
@id INT = NULL OUT,
@name VARCHAR(150) = NULL,
@desc VARCHAR(250) = NULL
AS
INSERT INTO dbo.Products
(Name,
Description)
VALUES
(@name,
@desc)
SET @id = SCOPE_IDENTITY();
Você deve selecionar a função scope_identity().
Para fazer isso a partir do código do aplicativo, normalmente encapsulo esse processo em um procedimento armazenado para que ainda pareça uma consulta ao meu aplicativo.
Costumo preferir anexar um gatilho à mesa usando o gerenciador corporativo.Dessa forma, você não precisa se preocupar em escrever instruções SQL extras em seu código.O meu é mais ou menos assim:
Crie Trigger TblName no dbo.tblname para inserir como selecione new_id = @@ identidade
Então, de dentro do seu código, trate suas instruções de inserção como instruções de seleção - basta executar e avaliar os resultados.a coluna "newID" conterá a identidade da linha que você acabou de criar.
Esta é provavelmente a melhor solução funcional que encontrei para o SQL Server.Sql Server retorna o valor da coluna de identidade após a instrução de inserção