none
Verificar existência de registro antes de inserir RRS feed

  • Pergunta

  • Olá,

     

    Preciso fazer um insert em uma tabela mas antes de inserir o registro, preciso saber se ele já existe.

     

    ex.:

     

    Parte do código:

     

    insert into tbVinculo

    (

            idCliente, idPlano, DataVinculo

    )

    values

    (

            @idCliente, @idPlano, @DataVinculo

    )

     not exists where

    (

           select idCliente from tbVinculo

           where idCliente = @idCliente

    )

     

    Obrigado.

    quinta-feira, 14 de fevereiro de 2008 03:00

Respostas

  • Boa Tarde José,

     

    Dê uma olhada no código abaixo:

    Code Snippet

    CREATE TABLE tblClientes (

    idCliente INT IDENTITY(1,1),

    idPlano INT,

    DataVinculo SMALLDATETIME)

     

    ALTER PROCEDURE usp_ManterCliente

    @idCliente INT = 0,

    @idPlano INT,

    @DataVinculo SMALLDATETIME,

    @idClienteOut INT OUTPUT

    AS

    IF EXISTS (SELECT * FROM tblClientes WHERE idCliente = @idCliente) OR (@idCliente != 0)

    BEGIN

    UPDATE tblClientes SET

    idPlano = @idPlano, DataVinculo = @DataVinculo

    WHERE IdCliente = @IdCliente

    SET @idClienteOut = @idCliente

    END

    ELSE

    BEGIN

    INSERT INTO tblClientes (IdPlano, DataVinculo) VALUES (@IdPlano, @DataVinculo)

    SET @idClienteOut = @@Identity

    END

     

    -- Novo Cliente (Id sempre igual a zero)

    DECLARE @ParIdCliente INT, @ParIdPlano INT, @ParDataVinculo SMALLDATETIME

    SET @ParIdCliente = 0

    SET @ParIdPlano = 1

    SET @ParDataVinculo = GETDATE()

     

    EXEC usp_ManterCliente

    @idCliente = @ParIdCliente,

    @idPlano = @ParIdPlano,

    @DataVinculo = @ParDataVinculo,

    @idClienteOUT = @ParIdCliente OUTPUT

     

    SELECT @ParIdCliente As Codigo

     

    SELECT * FROM tblClientes

     

    -- Alteração de Cliente (Id maior que zero)

    DECLARE @ParIdCliente INT, @ParIdPlano INT, @ParDataVinculo SMALLDATETIME

    SET @ParIdCliente = 1

    SET @ParIdPlano = 2

    SET @ParDataVinculo = GETDATE() - 20

     

    EXEC usp_ManterCliente

    @idCliente = @ParIdCliente,

    @idPlano = @ParIdPlano,

    @DataVinculo = @ParDataVinculo,

    @idClienteOUT = @ParIdCliente OUTPUT

     

    SELECT @ParIdCliente As Codigo

     

    SELECT * FROM tblClientes

     

    DROP TABLE tblClientes

     

     

    [ ]s,

     

    Gustavo

     

    quinta-feira, 14 de fevereiro de 2008 18:19

Todas as Respostas

  •  

    Pode ser assim

     


    -- exemplo
    --  Create Table #tbVinculo (idCliente int, idPlano int, DataVinculo datetime )


    Declare @idCliente int, @idPlano int , @DataVinculo datetime

    Select @idCliente =1, @idPlano =1 , @DataVinculo=getdate()

     


    insert into #tbVinculo (idCliente, idPlano, DataVinculo)
    Select  @idCliente, @idPlano, @DataVinculo
    Where @idCliente not in (select idcliente from #tbVinculo)

     

     

    mais veja se nao e melhor colocar uma chave com o campo idclient assim o sql mesmo nao insere e retorna uma mensagem, nao precisa nem ser PK pode ser apenas um indice ou contraint unique.

     

    Alter Table #tbVinculo Add Constraint Ucr_IdCliente Unique (Idcliente)

     

    Abs;

     

    quinta-feira, 14 de fevereiro de 2008 09:28
  • Gilberto,

     

    Concordo com a orientação do Marcelo.

     

    Mas esta verificação você deseja fazer dentro da sua aplicação?

    quinta-feira, 14 de fevereiro de 2008 10:21
  • OK...Concordo com as duas explicações mas pensei que houvesse uma outra maneira de se fazer isso....

     

     

    Obrigado aos dois.

    quinta-feira, 14 de fevereiro de 2008 10:27
  • Gilberto, neste caso você pode utilizar uma Trigger Instead Of Insert, ela é executada antes do comando.

     

    Veja exemplo:

     

    Code Snippet

    CREATE TABLE TbTeste (id int, nome varchar(10));

    GO

     

    CREATE TRIGGER dbo.trg_insert

    ON TbTeste

    INSTEAD OF INSERT

    AS

    IF EXISTS (SELECT a.id FROM inserted AS a INNER JOIN tbTeste AS b ON a.id = b.id)

    BEGIN

    --RAISERROR(50010, 16, 1, 'Registro já existe!')

    PRINT 'REGISTRO JÁ EXISTE!'

    ROLLBACK

    END

    ELSE

    INSERT tbTeste (id, nome) SELECT * FROM inserted

    GO

     

    INSERT TbTeste

    VALUES (1, 'João')

    INSERT TbTeste

    VALUES (2, 'Maria')

    --Teste da Trigger

    INSERT TbTeste

    VALUES (1, 'João')

     

    SELECT * FROM tbTeste

     

    --Apagando os objetos

    DROP TABLE TbTeste

     

     

    Espero ter ajudado!

     

    Abraços,

    quinta-feira, 14 de fevereiro de 2008 12:08
  • Boa tarde,
    comecei agora a mexer com Stored Procedures, a minha idéia é passar à sp as informações abaixo (adaptada ao seu exemplo) e se já houver o idCliente na tabela, alterar os outros campos, caso ainda não exista preciso que seja incluído e que retorne o código utilizado, como poderia fazer?

    idCliente
    idPlano
    DataVinculo
    quinta-feira, 14 de fevereiro de 2008 17:52
  • Gilberto,

     

       Concordo com as soluções dadas, caso não exista PK na tabela. Mas é esse o seu caso? Por que você precisaria saber se o cliente já existe?

     

       Caso seja para fazer o tratamento de erro, vc poderia se utilizar do erro retornado pelo INSERT na sua aplicação, usar uma mensagem customizada com o try/catch ou o raiserror (dependendo do caso) em uma SP, etc.

     

       Se a tabela tem PK (codCliente), e vc faz um SELECT (para verificar se o mesmo já existe) e depois o INSERT, executará 2 queries para obter seu resultado caso o cliente não exista. Caso faça apenas um INSERT, sempre executará uma query, e verificará o retorno da mesma: caso o cliente não exista, será gravado corretamente (retorno 0), e caso o cliente já exista, ocorrerá erro de PK, e vc tratará o erro na sua aplicação ou SP.

     

    [ ].

     

    quinta-feira, 14 de fevereiro de 2008 18:10
  • José,

     

    Não sei se o exemplo abaixo se aplica ao seu caso, mas creio que vc poderia usar o try/catch ou o próprio @@rowcount, a partir do retorno do update.

     

     

    Code Snippet

    ...

     

    (@idCliente int OUT,

    @idPlano int,

    @DataVinculo smalldatetime)

     

    AS

    BEGIN

     

            UPDATE Tab

            SET        idPlano = @idPlano, DataVinculo = @DataVinculo

            WHERE  idCliente = @idCliente

     

            IF (@@rowcount = 0)

            BEGIN

     

                INSERT INTO Tab

                       (idPlano, DataVinculo)

                VALUES

                       (@idPlano, @DataVinculo)

     

                SET @idCliente = scope_identity()

     

            END           

     

    END

     

     

     

    quinta-feira, 14 de fevereiro de 2008 18:18
  • Boa Tarde José,

     

    Dê uma olhada no código abaixo:

    Code Snippet

    CREATE TABLE tblClientes (

    idCliente INT IDENTITY(1,1),

    idPlano INT,

    DataVinculo SMALLDATETIME)

     

    ALTER PROCEDURE usp_ManterCliente

    @idCliente INT = 0,

    @idPlano INT,

    @DataVinculo SMALLDATETIME,

    @idClienteOut INT OUTPUT

    AS

    IF EXISTS (SELECT * FROM tblClientes WHERE idCliente = @idCliente) OR (@idCliente != 0)

    BEGIN

    UPDATE tblClientes SET

    idPlano = @idPlano, DataVinculo = @DataVinculo

    WHERE IdCliente = @IdCliente

    SET @idClienteOut = @idCliente

    END

    ELSE

    BEGIN

    INSERT INTO tblClientes (IdPlano, DataVinculo) VALUES (@IdPlano, @DataVinculo)

    SET @idClienteOut = @@Identity

    END

     

    -- Novo Cliente (Id sempre igual a zero)

    DECLARE @ParIdCliente INT, @ParIdPlano INT, @ParDataVinculo SMALLDATETIME

    SET @ParIdCliente = 0

    SET @ParIdPlano = 1

    SET @ParDataVinculo = GETDATE()

     

    EXEC usp_ManterCliente

    @idCliente = @ParIdCliente,

    @idPlano = @ParIdPlano,

    @DataVinculo = @ParDataVinculo,

    @idClienteOUT = @ParIdCliente OUTPUT

     

    SELECT @ParIdCliente As Codigo

     

    SELECT * FROM tblClientes

     

    -- Alteração de Cliente (Id maior que zero)

    DECLARE @ParIdCliente INT, @ParIdPlano INT, @ParDataVinculo SMALLDATETIME

    SET @ParIdCliente = 1

    SET @ParIdPlano = 2

    SET @ParDataVinculo = GETDATE() - 20

     

    EXEC usp_ManterCliente

    @idCliente = @ParIdCliente,

    @idPlano = @ParIdPlano,

    @DataVinculo = @ParDataVinculo,

    @idClienteOUT = @ParIdCliente OUTPUT

     

    SELECT @ParIdCliente As Codigo

     

    SELECT * FROM tblClientes

     

    DROP TABLE tblClientes

     

     

    [ ]s,

     

    Gustavo

     

    quinta-feira, 14 de fevereiro de 2008 18:19
  • OK...Gustavo era isso que eu precisava.

     

    Obrigado.

     

    sexta-feira, 15 de fevereiro de 2008 02:24