Inquiridor
Procedure Insere or Atualiza

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.
Todas as Respostas
-
-
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
-
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