none
Procedure Insere or Atualiza RRS feed

  • Discussão Geral

  • Boa noite galera, estou desenvolvendo um sistema para minha empresa, e como é comum em um sistema (inserir e atualizar dados de clientes, produtos, fornecedores e etc...) eu criei uma procedure onde eu insiro ou atualizo registro.

    Se eu vou editar um usuario, passo o código do mesmo para poder atualizar, se for um novo, passo código 0 e o registro é inserido.

    Fiz essa procedure para poder customizar meu código... Deixo abaixo o código da procedure caso alguém queira...

    USE [MSComm]
    GO

    CREATE PROCEDURE InsereOrAtualizaUsuario
    (
        @cdUsuario int,
        @nmUsuario varchar(50) ,
        @nmUltimoNome varchar(50) ,
        @dsLogin varchar(100) ,
        @dsSenha varchar(50) ,
        @tpStatus bigint ,
        @nuFixo varchar(13) ,
        @nuCelular varchar(14) ,
        @nuRamal varchar(6) ,
        @dsEmail varchar(70) ,
        @dsSkype varchar(70) ,
        @dsMSN varchar(70)
    )
    AS
    BEGIN
    IF (select count(*) from Usuario where cdUsuario = @cdUsuario) > 0
        UPDATE Usuario set nmUsuario = @nmUsuario, nmUltimoNome = @nmUltimoNome, dsLogin = @dsLogin, dsSenha = @dsSenha,
        tpStatus = @tpStatus, nuFixo = @nuFixo, nuCelular = @nuCelular, nuRamal = @nuRamal,dsEmail = @dsEmail, dsSkype = @dsSkype, dsMSN = @dsMSN
        WHERE cdUsuario = @cdUsuario
    ELSE
        INSERT INTO Usuario(nmUsuario,nmUltimoNome,dsLogin,dsSenha,tpStatus,nuFixo,nuCelular,nuRamal,dsEmail,dsSkype,dsMSN)
        VALUES(@nmUsuario,@nmUltimoNome,@dsLogin,@dsSenha,@tpStatus,@nuFixo,@nuCelular,@nuRamal,@dsEmail,@dsSkype,@dsMSN)
    END


    Willian Barreto "O perfeito é desumano, porque o humano é imperfeito!" Antes de imprimir, pense em sua responsabilidade e compromisso com o Meio Ambiente.

    sábado, 13 de julho de 2013 07:22

Todas as Respostas

  • William,  uma dica ao invés de fazer o SELECT COUNT (*), utilize EXISTS () pois eh uma melhor pratica de desenvolvimento.
    sábado, 8 de novembro de 2014 15:44
  • Willian,

    No MS SQL Server você tem a opção de usar "MERGE", segue o link com mais informações: 

    http://msdn.microsoft.com/pt-br/library/bb510625(v=sql.120).aspx

    ALTER PROCEDURE dbo.InsertUnitMeasure
        @UnitMeasureCode nchar(3),
        @Name nvarchar(25)
    AS 
    BEGIN
        SET NOCOUNT ON;
    
        MERGE Production.UnitMeasure AS target
        USING (SELECT @UnitMeasureCode, @Name) AS source (UnitMeasureCode, Name)
        ON (target.UnitMeasureCode = source.UnitMeasureCode)
        WHEN MATCHED THEN 
            UPDATE SET Name = source.Name
    WHEN NOT MATCHED THEN
        INSERT (UnitMeasureCode, Name)
        VALUES (source.UnitMeasureCode, source.Name)
        OUTPUT deleted.*, $action, inserted.* INTO #MyTempTable;
    END;
    GO


    Tulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote

    segunda-feira, 10 de novembro de 2014 11:30
  • William,

    Concordo com a sugestão do Tulio, utilizar o comando Merge que foi introduzido a partir do SQL Server 2008, veja alguns outros exemplos:

    -- Utilizando o Comando Merge de Forma Incremental --
    CREATE TABLE TB_ALVO 
    (
    CD_PESSOA int	IDENTITY(1, 1),
    NM_PESSOA varchar(30),
    CONSTRAINT PK_ALVO PRIMARY KEY(CD_PESSOA)
    );
    
    CREATE TABLE TB_ORIGEM 
    (
    CD_PESSOA int,
    NM_PESSOA varchar(30),
    CONSTRAINT PK_ORIGEM PRIMARY KEY(CD_PESSOA));
    GO
    
    INSERT TB_ALVO(NM_PESSOA) VALUES('Jose');
    INSERT TB_ALVO(NM_PESSOA) VALUES('João');
    INSERT TB_ALVO(NM_PESSOA) VALUES('Durval');
    GO
    
    INSERT TB_ORIGEM(CD_PESSOA, NM_PESSOA) Values(103, 'Miguel');
    INSERT TB_ORIGEM(CD_PESSOA, NM_PESSOA) Values(104, 'Sandro');
    GO
    
    
    SELECT * FROM TB_ALVO
    SELECT * FROM TB_ORIGEM
    
    MERGE TB_ALVO AS A
    USING TB_ORIGEM AS O
    ON (A.CD_PESSOA = O.CD_PESSOA)
    WHEN NOT MATCHED BY TARGET AND O.NM_PESSOA LIKE 'S%'
    	THEN INSERT(NM_PESSOA) VALUES(O.NM_PESSOA)
    WHEN MATCHED
    	THEN UPDATE SET A.NM_PESSOA = O.NM_PESSOA
    WHEN NOT MATCHED BY SOURCE AND A.NM_PESSOA LIKE 'S%'
    	THEN DELETE;
    GO
    
    SELECT * FROM TB_ALVO
    SELECT * FROM TB_ORIGEM
    GO
    
    DROP TABLE TB_ALVO
    DROP TABLE TB_ORIGEM
    GO
    -- Comando Merge em conjunto com Stored Procedure --
    
    -- Criando a Tabela ProdutosProduzidos --
    Create Table Produzidos
    (ControleProducao Int Identity(1,1) Primary Key,
     OrdemProducao Varchar(20) Not Null,
     DataProducao DateTime Not Null,
     Quantidade Int Not Null)
    On [Primary]
    Go
    
    -- Criando a Stored Procedure P_FindProduction --
    Create Procedure P_Production @OrdemProducao VarChar(20), @DataProducao DateTime
    As
    Begin
    Set NoCount On;
    
    Merge Produzidos As Target
     Using (Select @OrdemProducao, @DataProducao) As Source (OrdemProducao, DataProducao)
      On (Target.OrdemProducao = Source.OrdemProducao 
          And Target.DataProducao = Source.DataProducao)
     When Matched Then
      Update Set Quantidade = Quantidade + 1, DataProducao = GetDate()
     When Not Matched Then
      Insert (OrdemProducao, DataProducao, Quantidade)
      Values(Source.OrdemProducao, Source.DataProducao, 1)
      OUTPUT deleted.*, $action, inserted.*;
    
    End
    Go
    
    Select * from Produzidos
    
    Insert Into Produzidos (OrdemProducao, DataProducao, Quantidade)
    Values (1,GetDate(),1), 
           (2,GetDate(),1),
    	   (3,GetDate(),1)
    
    
    Exec P_Production 1, '2014-07-08 10:06:50.297'

    Create Table Loja1
    (Codigo Int Identity(1,1),
     CodProduto Int,
     Descricao Varchar(10))
    
    Create Table Loja2
    (Codigo Int Identity(1,1),
     CodProduto Int,
     Descricao Varchar(10))
    
    Create Table Lojas
    (Codigo Int Identity(1,1),
     CodProduto Int,
     Descricao Varchar(10))
    
    
    Insert Into Loja1 Values (IsNull(@@Identity,1),'Loja 1')
    Go 20
    
    Insert Into Loja1 Values (IsNull(@@Identity,1),'Loja 2')
    Go 15
    
    Merge Lojas Destino
    Using Loja1 Origem
    On Origem.Codigo = Destino.Codigo
    When Not Matched Then
     Insert Values(CodProduto, Descricao)
    When Matched Then
     Update Set Destino.Codigo = Origem.Codigo;
    
    Merge Lojas Destino
    Using Loja2 Origem
    On Origem.Codigo = Destino.Codigo
    When Matched Then
     Update Set Destino.Descricao = 'Em ambas as lojas'
    When Not Matched Then
     Insert Values (CodProduto, Descricao);



    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    quinta-feira, 13 de novembro de 2014 14:41