none
Dúvida sobre INSERT RRS feed

  • Pergunta

  • Bom dia amigos,

    Sou iniciante em SQL e estou querendo criar uma PROCEDURE para popular uma tabela:

    A tabela possui as seguintes colunas: lCodDocumentol lCodStatusl lOrdeml

    Obs: A lOrdeml estabelece a sequencia que o lCodStatusl aparece, e é estabelecido pela 'ordem' de números inteiros

    Preciso setar o valor de lOrdeml para um valor maior que o ultimo cadastrado, mas não estou sabendo como fazer... o que criei até então:

    CREATE PROCEDURE spInserirStatus  @CodStatus INT,  @CodDocumento INT,  @ordem INT, --????  @retorno NVARCHAR(50) output  AS  IF EXISTS(SELECT CodStatus                    FROM   DocumentoEvolucao                     WHERE  CodStatus = @CodStatus)              BEGIN                 SELECT @retorno = 'STATUS JÁ EXISTENTE.' RETURN (@retorno)             END            ELSE             BEGIN                 SELECT @retorno = ''                  BEGIN TRANSACTION INSERT INTO DocumentoEvolucao                             (CodDocumento,  CodStatus,                               Ordem) VALUES (@CodDocumento,  @CodStatus,  @ordem) --????????

    segunda-feira, 15 de dezembro de 2014 12:52

Respostas

  • Oi Maicon,

    Veja se consigo te ajudar, segue a procedure refeita. 


    CREATE PROCEDURE spInserirStatus  
    @CodDocumento INT,
    @CodStatus INT 
    AS  
    --Aqui você verifica se não existe o documento e o status cadastrado para que possa inserir
    IF EXISTS(SELECT *            
    FROM   DocumentoEvolucao                     
    WHERE   CodDocumento=@CodDocumento and  CodStatus=@CodStatus) 

    BEGIN                 
    SELECT 'STATUS JÁ EXISTENTE.'
             
    END
               
    ELSE      
    BEGIN

     --Aqui você seta a variável para receber o valor max da ordem 
      DECLARE @proximoOrdem AS INT SET @proximoOrdem = (SELECT isnull(max(Ordem),0)+1                 
    FROM   DocumentoEvolucao                     
    WHERE   CodDocumento=@CodDocumento)

    --Select @proximoOrdem --Descomente para ver o valor de retorno,  
    --@CodDocumento altere para o numero do documento que deseja validar gere somente o bloco acima para testes     

    INSERT INTO DocumentoEvolucao                             
    (CodDocumento,
     CodStatus,                              
     Ordem)
    VALUES
    (@CodDocumento,
     @CodStatus,
     @proximoOrdem) 
     END

    • Sugerido como Resposta AlineBC terça-feira, 16 de dezembro de 2014 16:12
    terça-feira, 16 de dezembro de 2014 16:12
  • Maicon, 

         Valide bem o código da sua proc e evite ao máximo (Entenda como NUNCA!!) o uso do MAX(..)+1 pois essa construção além de ter falhas tanto no SQL Server quanto em outros SGBDs, tem menor performance.

          Ao invés de utilizar o max, crie o campo assim: Create Table .... Ordem Int IDENTITY(1,1) e na hora do INSERT o SQL simplesmente irá colocar o próximo inteiro disponível. Aproveitei o código da Aline para sua melhor compreensão.

    --- Criação da Tabela
    Create Table DocumentoEvolucao
    (CodDocumento int,
     CodStatus int IDENTITY(1,1)) -- Isso informa ao SQL para Iniciar em 1 o contador sempre somando +1 ao próximo.
    
    CREATE PROCEDURE spInserirStatus  
    @CodDocumento INT,
    @CodStatus INT,
    @Retorno Varchar(50) Output 
    AS  
    --Aqui você verifica se não existe o documento e o status cadastrado para que possa inserir
    IF EXISTS(SELECT *            
                FROM   DocumentoEvolucao                     
                WHERE   CodDocumento=@CodDocumento and  CodStatus=@CodStatus) 
    
    BEGIN                 
          SELECT @Retorno = 'STATUS JÁ EXISTENTE.'
          Return @Retorno
    END
               
    ELSE      
    BEGIN
    
        INSERT INTO DocumentoEvolucao                             
    (CodDocumento,
     CodStatus)
    VALUES
    (@CodDocumento,
     @CodStatus) 
    
    -- Se você precisar saber qual é número da Ordem 
    --inserido, basta consultar a funcão SCOPE_IDENTITY()
    -- SELECT SCOPE_IDENTITY()
     END 


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008


    terça-feira, 30 de dezembro de 2014 12:14
    Moderador

Todas as Respostas

  • Antes de inserir o registro, faça uma SQL na tabela DocumentoEvolucao, dando um MAX na coluna ordem. Pegue o resultado e some +1.
    segunda-feira, 15 de dezembro de 2014 15:21
  • Oi Maicon,

    Veja se consigo te ajudar, segue a procedure refeita. 


    CREATE PROCEDURE spInserirStatus  
    @CodDocumento INT,
    @CodStatus INT 
    AS  
    --Aqui você verifica se não existe o documento e o status cadastrado para que possa inserir
    IF EXISTS(SELECT *            
    FROM   DocumentoEvolucao                     
    WHERE   CodDocumento=@CodDocumento and  CodStatus=@CodStatus) 

    BEGIN                 
    SELECT 'STATUS JÁ EXISTENTE.'
             
    END
               
    ELSE      
    BEGIN

     --Aqui você seta a variável para receber o valor max da ordem 
      DECLARE @proximoOrdem AS INT SET @proximoOrdem = (SELECT isnull(max(Ordem),0)+1                 
    FROM   DocumentoEvolucao                     
    WHERE   CodDocumento=@CodDocumento)

    --Select @proximoOrdem --Descomente para ver o valor de retorno,  
    --@CodDocumento altere para o numero do documento que deseja validar gere somente o bloco acima para testes     

    INSERT INTO DocumentoEvolucao                             
    (CodDocumento,
     CodStatus,                              
     Ordem)
    VALUES
    (@CodDocumento,
     @CodStatus,
     @proximoOrdem) 
     END

    • Sugerido como Resposta AlineBC terça-feira, 16 de dezembro de 2014 16:12
    terça-feira, 16 de dezembro de 2014 16:12
  • Oi Aline,

    Muito obrigado pela resposta, funcionou perfeitamente para o que eu precisava.

    sexta-feira, 26 de dezembro de 2014 17:46
  • Maicon, 

         Valide bem o código da sua proc e evite ao máximo (Entenda como NUNCA!!) o uso do MAX(..)+1 pois essa construção além de ter falhas tanto no SQL Server quanto em outros SGBDs, tem menor performance.

          Ao invés de utilizar o max, crie o campo assim: Create Table .... Ordem Int IDENTITY(1,1) e na hora do INSERT o SQL simplesmente irá colocar o próximo inteiro disponível. Aproveitei o código da Aline para sua melhor compreensão.

    --- Criação da Tabela
    Create Table DocumentoEvolucao
    (CodDocumento int,
     CodStatus int IDENTITY(1,1)) -- Isso informa ao SQL para Iniciar em 1 o contador sempre somando +1 ao próximo.
    
    CREATE PROCEDURE spInserirStatus  
    @CodDocumento INT,
    @CodStatus INT,
    @Retorno Varchar(50) Output 
    AS  
    --Aqui você verifica se não existe o documento e o status cadastrado para que possa inserir
    IF EXISTS(SELECT *            
                FROM   DocumentoEvolucao                     
                WHERE   CodDocumento=@CodDocumento and  CodStatus=@CodStatus) 
    
    BEGIN                 
          SELECT @Retorno = 'STATUS JÁ EXISTENTE.'
          Return @Retorno
    END
               
    ELSE      
    BEGIN
    
        INSERT INTO DocumentoEvolucao                             
    (CodDocumento,
     CodStatus)
    VALUES
    (@CodDocumento,
     @CodStatus) 
    
    -- Se você precisar saber qual é número da Ordem 
    --inserido, basta consultar a funcão SCOPE_IDENTITY()
    -- SELECT SCOPE_IDENTITY()
     END 


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008


    terça-feira, 30 de dezembro de 2014 12:14
    Moderador