none
Pq não consigo compilar essa procedure (os comandos internos foram inibidos mas a estrutura é essa) RRS feed

  • Pergunta

  • SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE PROCEDURE [dbo].[TESTE]
    (
    @fullnametxt varchar(MAX) ,
    @txtarq varchar(200) ,
    @dirdest1 varchar(500) output
    )
    AS

    IF OBJECT_ID('#LINHA') IS NOT NULL
    DROP TABLE #LINHA


    SET XACT_ABORT, NOCOUNT ON
    BEGIN TRY
    BEGIN TRAN
    SET @sql = N'BULK INSERT #LINHA FROM ''' + @fullnametxt + '''' 
    EXEC sp_executesql @sql 

    CREATE TABLE #E14TMP (
    [E14_SERPDV] [varchar](20)   COLLATE Latin1_General_BIN,
    [E14_SEQ] [int] IDENTITY(1,1)  )

    INSERT INTO #E14TMP
    SELECT 
    SUBSTRING(REPLACE(LIN,CHAR(39),' ') ,4,20)
    FROM #LINHA

    -- Se não existir dados com E14
    IF NOT EXISTS (SELECT 1 FROM #E14TMP)
    RAISERROR ('REGISTRO #E14# NAO ENCONTRADO NO ARQUIVO.', -- Message text.
      16, -- Severity.
    1 -- State.
      );

    --Busca em qual banco serão gravado os dados
    SELECT @banco = ZX0_BANCO, @emp = ZX0_CODIGO FROM ZX0YY0 WHERE ZX0_CGC = @cnpjemp
    -- Se banco não está cadastrado
    IF @@ROWCOUNT = 0
    BEGIN
    SET @sql = N'INSERT INTO LOGLOJA (DATA, ARQ, LOGARQ, STATUS) 
    VALUES ('''+@DataInput+''','''+@txtarq+''',''CNPJ ' + isnull(@cnpjemp,'NULO')  + ' NÃO ENCONTRADO NA TABELA [ZX0YY0] DO BANCO DE DADOS.'',''NAO OK'')'
    EXEC sp_executesql @sql
    WHILE (@@TRANCOUNT > 0)
    BEGIN
    COMMIT TRAN
    END 
    RETURN
    END


    -- Processamento dos documentos.
    WHILE (SELECT COUNT(*) FROM #E14TMP) > 0
    BEGIN 
    SELECT * INTO #ITENS FROM #E15TMP WHERE E15_DOC = @doc AND E15_PDV=@serpdv 

    WHILE (SELECT COUNT(*) FROM #ITENS) > 0 
    BEGIN
    DELETE FROM #ITENS WHERE E15_SEQ = @reg2
    END 

    DROP TABLE #ITENS
    DELETE FROM #E14TMP WHERE E14_SEQ = @reg
    END


    SET @sql = N'INSERT INTO LOGLOJA (DATA, ARQ, LOGARQ, STATUS) 
    VALUES (''' + REPLACE(CONVERT(char(10),GETDATE()  , 102),'.','')+''','''+@txtarq+''',''PROCESSADO'',''OK'')'
    EXEC(@sql)

    WHILE (@@TRANCOUNT > 0)
    BEGIN
    COMMIT TRAN
    END
    END
    END TRY

    BEGIN CATCH
    WHILE (@@TRANCOUNT > 0)
    BEGIN
    ROLLBACK TRAN
    END 

    SET @sql = N'INSERT INTO LOGLOJA (DATA, ARQ, LOGARQ, STATUS) 
    VALUES (''' + REPLACE(CONVERT(char(10),GETDATE()  , 102),'.','')+''','''+@txtarq+''',''' + ERROR_MESSAGE() + ''',''NAO OK'')'
    EXEC(@sql)
    END CATCH
    quarta-feira, 14 de dezembro de 2016 14:23

Respostas

  • Esse trecho está errado 

    COMMIT TRAN
    END
    END 
    END TRY  

    o correto é 

    COMMIT TRAN
    END
    END TRY  

    segue a Sp formatada

    SET ANSI_NULLS ON;
    GO
    SET QUOTED_IDENTIFIER ON;
    GO
    CREATE PROCEDURE [dbo].[TESTE]
        (
          @fullnametxt VARCHAR(MAX) ,
          @txtarq VARCHAR(200) ,
          @dirdest1 VARCHAR(500) OUTPUT
        )
    AS
        IF OBJECT_ID('#LINHA') IS NOT NULL
            DROP TABLE #LINHA;
    
    
        SET XACT_ABORT, NOCOUNT ON;
        BEGIN TRY
            BEGIN TRAN;
            SET @sql = N'BULK INSERT #LINHA FROM ''' + @fullnametxt + ''''; 
            EXEC sys.sp_executesql @sql; 
    
            CREATE TABLE #E14TMP
                (
                  [E14_SERPDV] [VARCHAR](20) COLLATE Latin1_General_BIN ,
                  [E14_SEQ] [INT] IDENTITY(1, 1)
                );
    
            INSERT  INTO #E14TMP
                    SELECT  SUBSTRING(REPLACE(LIN, CHAR(39), ' '), 4, 20)
                    FROM    #LINHA;
    
    -- Se não existir dados com E14
            IF NOT EXISTS ( SELECT  1
                            FROM    #E14TMP )
                RAISERROR ('REGISTRO #E14# NAO ENCONTRADO NO ARQUIVO.', -- Message text.
      16, -- Severity.
    1 -- State.
      );  
    
    --Busca em qual banco serão gravado os dados
            SELECT  @banco = ZX0_BANCO ,
                    @emp = ZX0_CODIGO
            FROM    ZX0YY0
            WHERE   ZX0_CGC = @cnpjemp;
    -- Se banco não está cadastrado
            IF @@ROWCOUNT = 0
                BEGIN
                    SET @sql = N'INSERT INTO LOGLOJA (DATA, ARQ, LOGARQ, STATUS) 
    VALUES (''' + @DataInput + ''',''' + @txtarq + ''',''CNPJ ' + ISNULL(@cnpjemp,
                                                                  'NULO')
                        + ' NÃO ENCONTRADO NA TABELA [ZX0YY0] DO BANCO DE DADOS.'',''NAO OK'')';
                    EXEC sys.sp_executesql @sql;
                    WHILE ( @@TRANCOUNT > 0 )
                        BEGIN
                            COMMIT TRAN;
                        END; 
                    RETURN;
                END;
    
    
    -- Processamento dos documentos.
            WHILE ( SELECT  COUNT(*)
                    FROM    #E14TMP
                  ) > 0
                BEGIN 
                    SELECT  *
                    INTO    #ITENS
                    FROM    #E15TMP
                    WHERE   E15_DOC = @doc
                            AND E15_PDV = @serpdv; 
    
                    WHILE ( SELECT  COUNT(*)
                            FROM    #ITENS
                          ) > 0
                        BEGIN
                            DELETE  FROM #ITENS
                            WHERE   E15_SEQ = @reg2;
                        END; 
    
                    DROP TABLE #ITENS;
                    DELETE  FROM #E14TMP
                    WHERE   E14_SEQ = @reg;
                END;
    
    
            SET @sql = N'INSERT INTO LOGLOJA (DATA, ARQ, LOGARQ, STATUS) 
    VALUES (''' + REPLACE(CONVERT(CHAR(10), GETDATE(), 102), '.', '') + ''','''
                + @txtarq + ''',''PROCESSADO'',''OK'')';
            EXEC(@sql);
    
            WHILE ( @@TRANCOUNT > 0 )
                BEGIN
                    COMMIT TRAN;
                END;
    
        END TRY
    
        BEGIN CATCH
            WHILE ( @@TRANCOUNT > 0 )
                BEGIN
                    ROLLBACK TRAN;
                END; 
    
            SET @sql = N'INSERT INTO LOGLOJA (DATA, ARQ, LOGARQ, STATUS) 
    VALUES (''' + REPLACE(CONVERT(CHAR(10), GETDATE(), 102), '.', '') + ''','''
                + @txtarq + ''',''' + ERROR_MESSAGE() + ''',''NAO OK'')';
            EXEC(@sql);
        END CATCH; 

    faz a conferência por favor


    Wesley Neves

    quarta-feira, 14 de dezembro de 2016 15:52

Todas as Respostas

  • Deleted
    quarta-feira, 14 de dezembro de 2016 14:30
  • Esse trecho está errado 

    COMMIT TRAN
    END
    END 
    END TRY  

    o correto é 

    COMMIT TRAN
    END
    END TRY  

    segue a Sp formatada

    SET ANSI_NULLS ON;
    GO
    SET QUOTED_IDENTIFIER ON;
    GO
    CREATE PROCEDURE [dbo].[TESTE]
        (
          @fullnametxt VARCHAR(MAX) ,
          @txtarq VARCHAR(200) ,
          @dirdest1 VARCHAR(500) OUTPUT
        )
    AS
        IF OBJECT_ID('#LINHA') IS NOT NULL
            DROP TABLE #LINHA;
    
    
        SET XACT_ABORT, NOCOUNT ON;
        BEGIN TRY
            BEGIN TRAN;
            SET @sql = N'BULK INSERT #LINHA FROM ''' + @fullnametxt + ''''; 
            EXEC sys.sp_executesql @sql; 
    
            CREATE TABLE #E14TMP
                (
                  [E14_SERPDV] [VARCHAR](20) COLLATE Latin1_General_BIN ,
                  [E14_SEQ] [INT] IDENTITY(1, 1)
                );
    
            INSERT  INTO #E14TMP
                    SELECT  SUBSTRING(REPLACE(LIN, CHAR(39), ' '), 4, 20)
                    FROM    #LINHA;
    
    -- Se não existir dados com E14
            IF NOT EXISTS ( SELECT  1
                            FROM    #E14TMP )
                RAISERROR ('REGISTRO #E14# NAO ENCONTRADO NO ARQUIVO.', -- Message text.
      16, -- Severity.
    1 -- State.
      );  
    
    --Busca em qual banco serão gravado os dados
            SELECT  @banco = ZX0_BANCO ,
                    @emp = ZX0_CODIGO
            FROM    ZX0YY0
            WHERE   ZX0_CGC = @cnpjemp;
    -- Se banco não está cadastrado
            IF @@ROWCOUNT = 0
                BEGIN
                    SET @sql = N'INSERT INTO LOGLOJA (DATA, ARQ, LOGARQ, STATUS) 
    VALUES (''' + @DataInput + ''',''' + @txtarq + ''',''CNPJ ' + ISNULL(@cnpjemp,
                                                                  'NULO')
                        + ' NÃO ENCONTRADO NA TABELA [ZX0YY0] DO BANCO DE DADOS.'',''NAO OK'')';
                    EXEC sys.sp_executesql @sql;
                    WHILE ( @@TRANCOUNT > 0 )
                        BEGIN
                            COMMIT TRAN;
                        END; 
                    RETURN;
                END;
    
    
    -- Processamento dos documentos.
            WHILE ( SELECT  COUNT(*)
                    FROM    #E14TMP
                  ) > 0
                BEGIN 
                    SELECT  *
                    INTO    #ITENS
                    FROM    #E15TMP
                    WHERE   E15_DOC = @doc
                            AND E15_PDV = @serpdv; 
    
                    WHILE ( SELECT  COUNT(*)
                            FROM    #ITENS
                          ) > 0
                        BEGIN
                            DELETE  FROM #ITENS
                            WHERE   E15_SEQ = @reg2;
                        END; 
    
                    DROP TABLE #ITENS;
                    DELETE  FROM #E14TMP
                    WHERE   E14_SEQ = @reg;
                END;
    
    
            SET @sql = N'INSERT INTO LOGLOJA (DATA, ARQ, LOGARQ, STATUS) 
    VALUES (''' + REPLACE(CONVERT(CHAR(10), GETDATE(), 102), '.', '') + ''','''
                + @txtarq + ''',''PROCESSADO'',''OK'')';
            EXEC(@sql);
    
            WHILE ( @@TRANCOUNT > 0 )
                BEGIN
                    COMMIT TRAN;
                END;
    
        END TRY
    
        BEGIN CATCH
            WHILE ( @@TRANCOUNT > 0 )
                BEGIN
                    ROLLBACK TRAN;
                END; 
    
            SET @sql = N'INSERT INTO LOGLOJA (DATA, ARQ, LOGARQ, STATUS) 
    VALUES (''' + REPLACE(CONVERT(CHAR(10), GETDATE(), 102), '.', '') + ''','''
                + @txtarq + ''',''' + ERROR_MESSAGE() + ''',''NAO OK'')';
            EXEC(@sql);
        END CATCH; 

    faz a conferência por favor


    Wesley Neves

    quarta-feira, 14 de dezembro de 2016 15:52
  • boa tarde Jose

    Os comandos internos da procedure foram excluidos.. 

    O que importa é a estrutura dos BEGIN e END que não estão funcionando.

    Grata

    quarta-feira, 14 de dezembro de 2016 16:16