none
Bulk Insert con paso de parametros

    Question

  • Hola amigos, Rengo un procedimiento almacenado, el cual me sube un archivo cvs atravez de un Bulk Insert

    este es asi:

    alter procedure SP_cargadatos

    as

    begin

    BULK INSERT TEMPORAL

    FROM 'C:\ARCHIVOS_PLANOS\ENERO2010'

    WITH (

    FIELDTERMINATOR=',',

            ROWTERMINATOR='\N'

    )

    end

    Tal cual se ve, no genera problemas, el problema es esta en "enduro" la ruta del archivo, por ende cuando intento pasarle la ruta completa atravez de ASP.net, sudecen 2 cosas

    1.- al hacerlo asi: 

    alter procedure SP_cargadatos

    @ruta

    as

    begin

    BULK INSERT TEMPORAL

    FROM @ruta

    WITH (

    FIELDTERMINATOR=',',

            ROWTERMINATOR='\N'

    )

    end

    me salen 2 mensajes de error

    1) Incorrect syntax near '@ruta'

    2) 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

    2.- Yal hacerlo asi

    alter procedure SP_cargadatos

    @ruta

    as

    begin

    BULK INSERT TEMPORAL

    FROM '@ruta'

    WITH (

    FIELDTERMINATOR=',',

            ROWTERMINATOR='\N'

    )

    end

    No ejecuta nada

     

    Que esta mal?

    Muchas Gracias

    Saturday, July 24, 2010 8:07 PM

Answers

  • Ahora como seria ese SQL Dinamico que me mencionas?


    Más o menos así:

    alter procedure SP_cargadatos
    @ruta nvarchar(200)
    as
    begin
    Declare @comando nvarchar(400)
    set @comando = 'BULK INSERT TEMPORAL FROM ''' + @ruta + ''' WITH (FIELDTERMINATOR='','', ROWTERMINATOR=''\N'')'
    EXEC sp_executesql @comando
    end
    Sunday, July 25, 2010 7:25 AM

All replies

  • Creo que el problema no está en el BULK INSERT sino en la declaración del parámetro @ruta. Has puesto simplemente esto:

    alter procedure SP_cargadatos
    @ruta
    as ...
    

    por lo que te falta poner el tipo del parámetro @ruta:

    alter procedure SP_cargadatos
    @ruta varchar(100)
    as ...
    

    Si no es eso, y te sigue fallando, podrías usar SQL dinámico y ejecutarlo con sp_executesql.

     

    Saturday, July 24, 2010 9:25 PM
  • Gracias por tu respuesta, pero el error fue mio al omitir en el post la declaracion de la variable, efectivamente en el SP lo tengo asi:

    @ruta varchar (200)

     

    Ahora como seria ese SQL Dinamico que me mencionas?

     

     

    Saturday, July 24, 2010 9:31 PM
  • Hola.

    En general, tienes que indicar el tipo del dato en la declaración de parámetros de los procedimientos almacenados:

    alter procedure SP_cargadatos @ruta varchar(500)...

     


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    Saturday, July 24, 2010 9:35 PM
  • Hola qwalgrande efectivamente, ya lo he puesto asi, pero me sigue arrojando los mismos errores

     

    Saturday, July 24, 2010 9:38 PM
  • Ahora como seria ese SQL Dinamico que me mencionas?


    Más o menos así:

    alter procedure SP_cargadatos
    @ruta nvarchar(200)
    as
    begin
    Declare @comando nvarchar(400)
    set @comando = 'BULK INSERT TEMPORAL FROM ''' + @ruta + ''' WITH (FIELDTERMINATOR='','', ROWTERMINATOR=''\N'')'
    EXEC sp_executesql @comando
    end
    Sunday, July 25, 2010 7:25 AM
  • Hola.

    ¿Resolviste el problema? Si no es así, por favor, indícanos qué errores te devuelve.


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    Saturday, August 07, 2010 3:04 PM
  • Hola, Pido disculpas por la tardanza de responder, pero me habia quedado pegado en otros procedimiento, he probado esta ayuda que me han brindado, y me resulta bien, solo tengo una duda a modo de aprendizaje:

    mi archivo de texto (al cual le hago el bulk insert) cada columna tiene cabecera, ejemplo

    Rut Nombre Edad
    1-1 Pablo     27
    2-3 Jose      34

    Sin embargo sin manipular el archivo de texto, cuando hago el bulk insert automaticamente, me borra la cabecera de las columnas, esto en la practica esta bien hecho, (solo necesito los datos y no la cabecera) pero a modo de duda; siempre el bulk insert desecha la primera fila de un archivo el cual se desea cargar?
    Eso es todo, la carga me sale perfecta,
    Muchas Gracias
    Wednesday, August 18, 2010 9:05 AM
  • Hola.

    En la documentación se indica que el parámetro FIRSTROW indica la primera fila a insertar y que por defecto es la fila 1 (empezando a contar en el 1).

    http://msdn.microsoft.com/es-es/library/ms188365.aspx

    Según eso, debería ser necesario indicarle el parámetro FIRTSROW=2 para que se salte las cabeceras (aunque ese parámetro no tenga esa finalidad, en la práctica sería muy similar). Sin embargo, existen referencias que indican que la primera fila de un fichero es la fila 0, con lo que se trataría de encabezados, que serían omitidos. Pues bien, la razón teórica sería que ese primer registros no es identificado como un registro válido y es ignorado:

    http://www.eggheadcafe.com/software/aspnet/35159919/bulk-insert-error-msgs.aspx


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    Wednesday, August 18, 2010 9:37 AM