none
Alterar(UPDATE) dados de duas tabelas no sql server RRS feed

  • Pergunta

  • 1º - Tenho duas tabelas: Tb_Funcionario(CodFunc, NomeFunc,SexoFunc,DataNascFunc) e Tb_TelefFunc(CodTelef, TelefFunc). A ideia é criar um procedimento armazenado que me permita alterar(actualizar) dados das duas tabelas, como faço isso?

    Relacionamento
    Alter Table Tb_TelefFunc ADD Constraint FK_Tb_TelefFunc_Tb_Funcionario
    Foreign Key(CodTelef) References Tb_Funcionario(CodFunc);

    Consigo criar um procedimento armazenado para inserir nas duas tabelas em simultâneo, mas não consigo altera-las.

    CREATE DATABASE Db_SitemaCadstroFuncionarios;
    USE Db_SitemaCadstroFuncionarios;
     
     
    CREATE TABLE Tb_Funcionario
    (
        CodFuncion INT PRIMARY KEY IDENTITY NOT NULL,
        NomeFuncion VARCHAR(50)NOT NULL,
        BI VARCHAR(16)NOT NULL,
        SexoFuncion CHAR(1)NOT NULL,
        NascimentoFuncion DATE NOT NULL,
        EstCivilFuncion VARCHAR(17)NULL
    );
     
    CREATE TABLE Tb_TelFuncion
    (
        CodTelFuncion INT NOT NULL,
        TelFuncion VARCHAR(11) NOT NULL,
        PRIMARY KEY(CodTelFuncion,TelFuncion)
    );
     
     
    ALTER TABLE Tb_TelFuncion ADD CONSTRAINT FK_Tb_TelFuncion_Tb_Funcionario
    FOREIGN KEY(CodTelFuncion) REFERENCES Tb_Funcionario(CodFuncion);
     
    -- Proceedimento
    -- Procedimento para alterar funcionario
    CREATE PROC uSp_UpDateFuncionario
    (
        @CodFuncion AS INT,
        @NomeFuncion AS VARCHAR(50),
        @BI AS VARCHAR(16),
        @SexoFuncion AS CHAR(1),
        @NascimentoFuncion AS DATE,
        @EstCivilFuncion VARCHAR(17),
        @TelFuncionPrincipal AS VARCHAR(11),
        @TelFuncionAlteranativo AS VARCHAR(11) = NULL
    )
    AS
        BEGIN
            BEGIN TRY
                BEGIN TRAN
                -- alterar na tabela funcionario            
     
                UPDATE Tb_Funcionario
                SET 
                    NomeFuncion = @NomeFuncion,
                    BI = @BI,
                    SexoFuncion = @SexoFuncion,
                    NascimentoFuncion = @NascimentoFuncion,
                    EstCivilFuncion = @EstCivilFuncion
                WHERE CodFuncion = @CodFuncion
     
                DECLARE @CodGerado AS INT = @CodFuncion;
     
                -- alterar na tabela telefone
                IF(@TelFuncionPrincipal IS NOT NULL)
                BEGIN
                    UPDATE Tb_TelFuncion
                    SET
                        TelFuncion = @TelFuncionPrincipal
                    WHERE CodTelFuncion = @CodGerado
                END
     
                IF(@TelFuncionAlteranativo IS NOT NULL)
                BEGIN
                    UPDATE Tb_TelFuncion
                    SET
                        TelFuncion = @TelFuncionAlteranativo
                    WHERE
                        CodTelFuncion = @CodGerado;
                END
     
                SELECT @CodFuncion AS Retorno;      
     
                COMMIT TRAN
            END TRY
            BEGIN CATCH
            ROLLBACK TRAN
            SELECT ERROR_MESSAGE()
            END CATCH
        END
    

    2º  - Ao fazer um select(criei um procedimento de consulta), ele trás os dados repetidos por causa do telefone principal e alternativo, não há problema nisto? Caso não seja correto retornar este valor, como faço para retornar os valores correto? És o código:

    -- procedimento para consultar
    CREATE PROC uSp_ConsultarFuncionario
    (
    	@CodFuncion AS INT = NULL,
    	@NomeFuncion AS VARCHAR(50) = NULL,
    	@BI AS VARCHAR(16) = NULL,
    	@TelFuncion AS INT = NULL
    )
    AS
    	BEGIN
    		BEGIN TRY
    			BEGIN TRAN
    			
    			SELECT 
    				func.CodFuncion,
    				func.NomeFuncion,
    				func.BI,
    				func.SexoFuncion,
    				func.NascimentoFuncion,
    				func.EstCivilFuncion,
    				tel.TelFuncion
    			FROM Tb_Funcionario AS func	
    			JOIN Tb_TelFuncion AS tel ON func.CodFuncion = tel.CodTelFuncion	
    
    			WHERE(@CodFuncion IS NULL OR func.CodFuncion = @CodFuncion)AND
    				 (@NomeFuncion IS NULL OR func.NomeFuncion LIKE '%' + @NomeFuncion + '%')AND
    				 (@BI IS NULL OR func.BI LIKE '%' + @BI + '%')AND
    				 (@TelFuncion IS NULL OR tel.TelFuncion = @TelFuncion);
    
    			COMMIT TRAN
    		END TRY
    		BEGIN CATCH
    		ROLLBACK TRAN
    		SELECT ERROR_MESSAGE()
    		END CATCH
    	END
    

    És o resultado

    1             Anacleto Bunga 002025701LA036             M           1987-06-15         Solteiro(a)               923776043
    
    1             Anacleto
    Bunga 002025701LA036             M           1987-06-15         Solteiro(a)               993231938
    
    3             Filipa
    Pedro        002025701LA036             F             1989-03-12         Divorciado(a)               912764539
    
    4             Anacleto
    Bunga2             002023701BA036            M           1987-06-15         Solteiro(a)               928548351
    
    8             Carla
    Mendes     002023701LS012             M           1987-06-15         Solteiro(a)               927109831
    
    10          Paula     002023701LN000            F             1987-06-15         Viuva(a)               3216199999
    
    10          Paula     002023701LN000            F             1987-06-15         Viuva(a)               997109800
    
    11          Paula
    Fernando 002023701KN000            F             1987-06-15         Casada(a)               1216199999
    

    domingo, 11 de outubro de 2015 22:39

Respostas

  • Boa tarde,

    Por falta de retorno do usuário, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    • Marcado como Resposta Marcos SJ terça-feira, 20 de outubro de 2015 19:22
    terça-feira, 20 de outubro de 2015 19:22

Todas as Respostas

  • 1º - Tenho duas tabelas: Tb_Funcionario(CodFunc, NomeFunc,SexoFunc,DataNascFunc) e Tb_TelefFunc(CodTelef, TelefFunc). A ideia é criar um procedimento armazenado que me permita alterar(actualizar) dados das duas tabelas, como faço isso?

    Relacionamento
    Alter Table Tb_TelefFunc ADD Constraint FK_Tb_TelefFunc_Tb_Funcionario
    Foreign Key(CodTelef) References Tb_Funcionario(CodFunc);

    Consigo criar um procedimento armazenado para inserir nas duas tabelas em simultâneo, mas não consigo altera-las.

    CREATE DATABASE Db_SitemaCadstroFuncionarios;
    USE Db_SitemaCadstroFuncionarios;
     
     
    CREATE TABLE Tb_Funcionario
    (
        CodFuncion INT PRIMARY KEY IDENTITY NOT NULL,
        NomeFuncion VARCHAR(50)NOT NULL,
        BI VARCHAR(16)NOT NULL,
        SexoFuncion CHAR(1)NOT NULL,
        NascimentoFuncion DATE NOT NULL,
        EstCivilFuncion VARCHAR(17)NULL
    );
     
    CREATE TABLE Tb_TelFuncion
    (
        CodTelFuncion INT NOT NULL,
        TelFuncion VARCHAR(11) NOT NULL,
        PRIMARY KEY(CodTelFuncion,TelFuncion)
    );
     
     
    ALTER TABLE Tb_TelFuncion ADD CONSTRAINT FK_Tb_TelFuncion_Tb_Funcionario
    FOREIGN KEY(CodTelFuncion) REFERENCES Tb_Funcionario(CodFuncion);
     
    -- Proceedimento
    -- Procedimento para alterar funcionario
    CREATE PROC uSp_UpDateFuncionario
    (
        @CodFuncion AS INT,
        @NomeFuncion AS VARCHAR(50),
        @BI AS VARCHAR(16),
        @SexoFuncion AS CHAR(1),
        @NascimentoFuncion AS DATE,
        @EstCivilFuncion VARCHAR(17),
        @TelFuncionPrincipal AS VARCHAR(11),
        @TelFuncionAlteranativo AS VARCHAR(11) = NULL
    )
    AS
        BEGIN
            BEGIN TRY
                BEGIN TRAN
                -- alterar na tabela funcionario            
     
                UPDATE Tb_Funcionario
                SET 
                    NomeFuncion = @NomeFuncion,
                    BI = @BI,
                    SexoFuncion = @SexoFuncion,
                    NascimentoFuncion = @NascimentoFuncion,
                    EstCivilFuncion = @EstCivilFuncion
                WHERE CodFuncion = @CodFuncion
     
                DECLARE @CodGerado AS INT = @CodFuncion;
     
                -- alterar na tabela telefone
                IF(@TelFuncionPrincipal IS NOT NULL)
                BEGIN
                    UPDATE Tb_TelFuncion
                    SET
                        TelFuncion = @TelFuncionPrincipal
                    WHERE CodTelFuncion = @CodGerado
                END
     
                IF(@TelFuncionAlteranativo IS NOT NULL)
                BEGIN
                    UPDATE Tb_TelFuncion
                    SET
                        TelFuncion = @TelFuncionAlteranativo
                    WHERE
                        CodTelFuncion = @CodGerado;
                END
     
                SELECT @CodFuncion AS Retorno;      
     
                COMMIT TRAN
            END TRY
            BEGIN CATCH
            ROLLBACK TRAN
            SELECT ERROR_MESSAGE()
            END CATCH
        END
    
    

    2º  - Ao fazer um select(criei um procedimento de consulta), ele trás os dados repetidos por causa do telefone principal e alternativo, não há problema nisto? Caso não seja correto retornar este valor, como faço para retornar os valores correto? És o código:

    -- procedimento para consultar CREATE PROC uSp_ConsultarFuncionario ( @CodFuncion AS INT = NULL, @NomeFuncion AS VARCHAR(50) = NULL, @BI AS VARCHAR(16) = NULL, @TelFuncion AS INT = NULL ) AS BEGIN BEGIN TRY BEGIN TRAN SELECT func.CodFuncion, func.NomeFuncion, func.BI, func.SexoFuncion, func.NascimentoFuncion, func.EstCivilFuncion, tel.TelFuncion FROM Tb_Funcionario AS func JOIN Tb_TelFuncion AS tel ON func.CodFuncion = tel.CodTelFuncion WHERE(@CodFuncion IS NULL OR func.CodFuncion = @CodFuncion)AND (@NomeFuncion IS NULL OR func.NomeFuncion LIKE '%' + @NomeFuncion + '%')AND (@BI IS NULL OR func.BI LIKE '%' + @BI + '%')AND (@TelFuncion IS NULL OR tel.TelFuncion = @TelFuncion); COMMIT TRAN END TRY BEGIN CATCH ROLLBACK TRAN SELECT ERROR_MESSAGE() END CATCH END

    És o resultado

    1             Anacleto Bunga 002025701LA036             M           1987-06-15         Solteiro(a)               923776043

    1             Anacleto Bunga 002025701LA036             M           1987-06-15         Solteiro(a)               993231938

    3             Filipa Pedro        002025701LA036             F             1989-03-12         Divorciado(a)               912764539

    4             Anacleto Bunga2             002023701BA036            M           1987-06-15         Solteiro(a)               928548351

    8             Carla Mendes     002023701LS012             M           1987-06-15         Solteiro(a)               927109831

    10          Paula     002023701LN000            F             1987-06-15         Viuva(a)               3216199999

    10          Paula     002023701LN000            F             1987-06-15         Viuva(a)               997109800

    11          Paula Fernando 002023701KN000            F             1987-06-15         Casada(a)               1216199999


    • Mesclado Marcos SJ quarta-feira, 14 de outubro de 2015 12:58 Thread duplicada
    domingo, 4 de outubro de 2015 09:49
  • @Anacleto Bunga

    Qual e o problema?


    A flower cannot blossom without sunshine, and man cannot live without love.

    • Marcado como Resposta Marcos SJ terça-feira, 13 de outubro de 2015 18:08
    terça-feira, 13 de outubro de 2015 16:36
    Moderador
  • Boa tarde,

    Por falta de retorno do usuário, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 13 de outubro de 2015 18:09
  • @Anacleto Bunga

    Qual e o problema?


    A flower cannot blossom without sunshine, and man cannot live without love.


    @Anacleto Bunga

    Qual é o problema?


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quinta-feira, 15 de outubro de 2015 12:07
  • Boa tarde,

    Por falta de retorno do usuário, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    • Marcado como Resposta Marcos SJ terça-feira, 20 de outubro de 2015 19:22
    terça-feira, 20 de outubro de 2015 19:22