No SQL Server é possível obter o “id” de um registro quando o Insert é executado?

StackOverflow https://stackoverflow.com/questions/55159

  •  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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top