none
Parametro em tabela temporaria RRS feed

  • Pergunta

  • Olá, fiz uma tabela temporária dentro de uma Stored Procedure, da seguinte forma:

    ALTER

    PROCEDURE [dbo].[SP_DADOSBOVESPA]

    @Endereco

    VARCHAR(255)= null,

     

    AS

    BEGIN

     

    DECLARE

    @msgerro

    varchar (255),
     

    @Ident

    Varchar(2),

    @NmArq

    Varchar(20),

    @DtIni

    Varchar(10),

    @DtFim

    Varchar(10),

    @Detalhe

    VARCHAR(60),

    @Caminho

    VARCHAR(255)

     

     

    CREATE TABLE #Arquivo (Detalhe VARCHAR(60))

     

    BULK INSERT #Arquivo FROM @Endereco - o erro está ocorrendo aqui, pois quero passar o endereço do arquivo txt, via parametro mas não estou conseguinto, da o seguinte erro: Incorrect syntax near '@Endereco'

     

    WITH

     

    (

    ROWTERMINATOR

    ='\n',

    FIRSTROW

    =1,

    LASTROW

    =1,

    FIELDTERMINATOR

    = ' '

     

     

    )
    quarta-feira, 23 de março de 2011 19:59

Respostas

  • ele so ocorre pq é neste momento que vai executar o @comando...

    no @comando vc precisa informar o nome do arquivo com apostrofe e para isto precisa adicionar dois, pois vc esta concactenando...

     SET @Comando = 'BULK INSERT #Arquivo FROM '''+ @NomeArqCarga +''' WITH (FIRSTROW=2,CODEPAGE=''ACP'',FIELDTERMINATOR = '';'',BATCHSIZE = 1000,ROWTERMINATOR = ''\n'')'

    Observe no trecho em negrito e sublinhado acima são 3 apostrofes

    Att. 
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Marcado como Resposta Richard Juhasz segunda-feira, 28 de março de 2011 19:53
    quinta-feira, 24 de março de 2011 18:13

Todas as Respostas

  • Tente transformar o trecho do Bulk Insert da tua procedure em SQL Dinâmico. Assim você pode CONCATENAR o valor da variável @Endereco no comando Bulk Insert.
    Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert
    quarta-feira, 23 de março de 2011 20:04
  • Rabelo,

    O @Endereco é uma parâmetro de entrada da sua procedure e não uma variável que poderá ser utilizada dentro do Bulk Insert, desta forma que você esta tentando fazer não seria possível.

    Tente assim, é um simples exemplo.

    Declare @Comando Varchar(1000), @Endereco @Varchar(300)

    Set @Endereco = 'MinhaTable'

    Set @Comando='BULK INSERT #Arquivo FROM '+ @Endereco

    Exec(@comando)

     


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    quarta-feira, 23 de março de 2011 20:04
  • Olá, estou fazendo uma tabela temporaria dentro de uma stored procedure e utilizando um Bulk insert, quando executo passo o paramento do @Endereco  sendo 'C:\Publico\NEG_20080601_A_20080630.txt', me retorna o seguinte erro:

    Msg 102, Level 15, State 1, Line 1

    Incorrect syntax near 'C:'.

    Não consigo encontrar.

     

     

     

    set

    ANSI_NULLS ON

    set QUOTED_IDENTIFIER

    ON

    go

     

    -- =============================================

    -- Author: <Luis Dias Rabelo>

    -- Create date: <21/03/2011>

    -- Description: <Insero de dados na tabela BOVESPA>

    -- =============================================

    ALTER

    PROCEDURE [dbo].[SP_DADOSBOVESPA]

    @Endereco

    VARCHAR(255)= null

     

    AS

    BEGIN

     

    DECLARE

    @msgerro

    varchar (255),
     

    @Ident

    Varchar(2),
     

    @NmArq

    Varchar(20),

    @DtIni

    Varchar(10),

    @DtFim

    Varchar(10),

    @Detalhe

    VARCHAR(60),

    @Caminho

    VARCHAR(255),

    @Comando

    Varchar(60)

     

    set @Caminho=rtrim(@Endereco)

     

    CREATE TABLE #Arquivo (Detalhe VARCHAR(60))

     

    --SET @Caminho = 'C:\Publico\NEG_20080601_A_20080630.txt'

     

    --BULK INSERT #Arquivo FROM +@Caminho

     

    Set @Comando='BULK INSERT #Arquivo FROM '+ @Caminho

     

    Set @Comando=@Comando+' WITH'

     

    Set @Comando=@Comando+' ('

     

    Set @Comando=@Comando+' ROWTERMINATOR =\n,'

     

    Set @Comando=@Comando+' FIRSTROW=1,'

     

    Set @Comando=@Comando+' LASTROW=1,'

     

    Set @Comando=@Comando+' FIELDTERMINATOR = '

     

    Set @Comando=@Comando+' )'

     

    Exec(@comando)
    quarta-feira, 23 de março de 2011 21:19
  • LDRabelo,

    Ficou faltando o END no fim da sua procedure

    Set @Comando=@Comando+' LASTROW=1,' 
    Set @Comando=@Comando+' FIELDTERMINATOR = ' 
    Set @Comando=@Comando+' )' 
    Exec(@comando)
    END
    

     

    Espero que ajude

    Se for útil marque como resposta.

    quarta-feira, 23 de março de 2011 23:41
  • Pessoal, obrigado pela ajuda, mais ainda não consegui resolver esse problema de passar parametro para BULK INSERT, tenho a variavel @NomeArqCarga, onde será passado o nome do arquivo TXT que será inserido, quando passo esse paramento me retorna o seguinte erro:

    Msg 102, Level 15, State 1, Line 1
    Incorrect syntax near 'WI'.

    essa e a minha rotina

    CREATE TABLE #Arquivo (Detalhe VARCHAR(60))


     SET @Comando = 'BULK INSERT #Arquivo FROM ''C:\SisInvestimento\' + @NomeArqCarga + '.txt '' WITH (FIRSTROW=2,CODEPAGE=''ACP'',FIELDTERMINATOR = '';'',BATCHSIZE = 1000,ROWTERMINATOR = ''\n'')'
     Exec(@comando)


    qualquer ajuda será bem vinda

    Luis Rabelo

    Cuiabá/MT

    quinta-feira, 24 de março de 2011 15:50
  • Luiz

    FAz um PRINT @comando para que possamos ver o comando enviado... fiz um teste em meu ambiente e funcionou perfeitamente...

    declare @NomeArqCarga varchar(60), @Comando varchar(max)
    set @NomeArqCarga='teste'
    
    CREATE TABLE #Arquivo (Detalhe VARCHAR(60))
    
     SET @Comando = 'BULK INSERT #Arquivo FROM ''C:\' + @NomeArqCarga + '.txt '' WITH (FIRSTROW=2,CODEPAGE=''ACP'',FIELDTERMINATOR = '';'',BATCHSIZE = 1000,ROWTERMINATOR = ''\n'')'
     Exec(@comando)
    
    

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quinta-feira, 24 de março de 2011 16:50
  • Valeu Marcelo, o meu erro e que na variavel @Comando eu, defini com varchar(60), bastou mudar para varchar(max).

    agora está dando outro erro, quando executo da o seguinte erro:

     Msg 319, Level 15, State 1, Line 1
    Incorrect syntax near the keyword 'with'. If this statement is a common table expression or an xmlnamespaces clause, the previous statement must be terminated with a semicolon.

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    -- =============================================
    -- Author:  <Luis Dias Rabelo>
    -- Create date: <21/03/2011>
    -- Description: <Inserção de dados na tabela BOVESPA>
    -- =============================================
    ALTER PROCEDURE [dbo].[SP_DADOSBOVESPA]
    @NomeArqCarga VARCHAR(255)= null
    AS
    BEGIN
       DECLARE
       @msgerro varchar (255),
       @Ident Varchar(2),
       @NmArq Varchar(20),
       @DtIni Varchar(10),
       @DtFim Varchar(10),
       @Detalhe VARCHAR(60),
       @Caminho VARCHAR(255),
       @Comando Varchar(MAX)
          
       CREATE TABLE #Arquivo (Detalhe VARCHAR(60))
       SET @Comando = 'BULK INSERT #Arquivo FROM '+ @NomeArqCarga +' WITH (FIRSTROW=2,CODEPAGE=''ACP'',FIELDTERMINATOR = '';'',BATCHSIZE = 1000,ROWTERMINATOR = ''\n'')'
       Exec(@comando)
    END

    luis

    quinta-feira, 24 de março de 2011 17:39
  • Luis

    Falta adicinar o ' no nome do arquivo... teste o script abaixo

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    -- =============================================
    -- Author: <Luis Dias Rabelo>
    -- Create date: <21/03/2011>
    -- Description: <Inserção de dados na tabela BOVESPA>
    -- =============================================
    ALTER PROCEDURE [dbo].[SP_DADOSBOVESPA]
    @NomeArqCarga VARCHAR(255)= null
    AS
    BEGIN
      DECLARE 
      @msgerro varchar (255),
      @Ident Varchar(2),
      @NmArq Varchar(20),
      @DtIni Varchar(10),
      @DtFim Varchar(10), 
      @Detalhe VARCHAR(60),
      @Caminho VARCHAR(255),
      @Comando Varchar(MAX)
        
      CREATE TABLE #Arquivo (Detalhe VARCHAR(60))
      SET @Comando = 'BULK INSERT #Arquivo FROM '''+ @NomeArqCarga +''' WITH (FIRSTROW=2,CODEPAGE=''ACP'',FIELDTERMINATOR = '';'',BATCHSIZE = 1000,ROWTERMINATOR = ''\n'')'
      Exec(@comando)
    END
    

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quinta-feira, 24 de março de 2011 17:53
  • Marcelo, mas esse erro somente acontece quando eu executo a procedure passando o parametro para a variavel @NomeArqCarga, não entendi o que vc quis dizer

     

    abraços 

    quinta-feira, 24 de março de 2011 18:04
  • ele so ocorre pq é neste momento que vai executar o @comando...

    no @comando vc precisa informar o nome do arquivo com apostrofe e para isto precisa adicionar dois, pois vc esta concactenando...

     SET @Comando = 'BULK INSERT #Arquivo FROM '''+ @NomeArqCarga +''' WITH (FIRSTROW=2,CODEPAGE=''ACP'',FIELDTERMINATOR = '';'',BATCHSIZE = 1000,ROWTERMINATOR = ''\n'')'

    Observe no trecho em negrito e sublinhado acima são 3 apostrofes

    Att. 
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Marcado como Resposta Richard Juhasz segunda-feira, 28 de março de 2011 19:53
    quinta-feira, 24 de março de 2011 18:13
  • Valeu Marcelo, mto obrigado, agora funcionou!!

     

    abraços

    quinta-feira, 24 de março de 2011 18:22
  • Luis

    Obrigado pelo retorno, se possivel e achar justo, maque a(s) thread(s) que o ajudou. esta ação pode ajudar outros usuários do forum com a mesma dúvida.

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    sexta-feira, 25 de março de 2011 13:34