none
Exportar tabla de SQL Server con cierta cantidad de ceros RRS feed

  • Pregunta

  • Buen día, tengo una duda que espero me puedan orientar a encontrar una posible solución. Estoy empezando a utilizar la herramienta SQL Server, y con el BCP estoy exportando tablas, pero quisiera saber si una vez que estos documentos estén creados, me puedan respetar cierta cantidad de ceros y no colocar por default solo uno.

    Lo que quiero que exporte:

    Col1 Col2 Col3 Col5 Col6 Col7
    520602 000010895970150100  000010 RR01 000101089597   0001
    520602 000013971560150100  000013 RR01 000101397156 0001
    520602 000018317370110100  000018 RR01 000101831737 0001
    520602 000024177760100100    000024  RR01 000102417776 0001

    Pero la exportación resulta así(lo cual también lo necesito, pero para este caso, requiero otro documento que me los respete):

    Col1 Col2 Col3 Col5 Col6 Col7
    520602 1.0896E+13 10 RR01 101089597 1
    520602 1.39716E+13 13 RR01 101397156 1
    520602 1.83174E+13 18 RR01 101831737 1
    520602 2.41778E+13 24 RR01 102417776 1

    Y quisiera que fuera por otro camino que no sea el SSIS, ni de forma manual mediante consulta. He intentado cambiarle el tipo de dato a las columnas a texto pero no veo diferencia. Si se necesita de alguna otra herramienta, son más que bienvenidas. Gracias.

    sábado, 24 de agosto de 2019 0:02

Respuestas

  • Me parece que la solución es utilizar la consulta SQL en BCP para formatear valores numéricos con ceros a la izquierda.

    He aquí una sugerencia para el código SQL que inserte en el comando BCP:

    -- código #1
    SELECT Col1, 
           right (replicate ('0', 18) + cast (Col2 as varchar(18)), 18) as Col2,
           right (replicate ('0', 6) + cast (Col3 as varchar(6)), 6) as Col3,
           Col5,
           right (replicate ('0', 12) + cast (Col6 as varchar(12)), 12) as Col6,
           right (replicate ('0', 4) + cast (Col7 as varchar(4)), 4) as Col7
      from ...
     

    La sugerencia anterior considera que las columnas Col2, Col3, Col6 y Col7 se declararon con un tipo de datos numérico.

    Evaluar el uso de la función STR() en lugar de la función CAST() si alguna columna ha sido declarada como float.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    sábado, 24 de agosto de 2019 11:36

  • La solución que propuse no borra los ceros, sino que formatea según el modelo de resultado que has publicado.

    -- código #2
    USE tempDB;
    
    CREATE TABLE tbTabla (Col1 int, Col2 bigint, Col3 int, Col5 char(4), Col6 int, Col7 int);
    go
    
    INSERT into tbTabla values
    (520602, 10895970150100, 10, 'RR01', 101089597, 1),
    (520602, 13971560150100, 13, 'RR01', 101397156, 1),
    (520602, 18317370110100, 18, 'RR01', 101831737, 1),
    (520602, 24177760100100, 24, 'RR01', 102417776, 1);
    go
    
    --
    SELECT * from tbTabla;
    --
    SELECT Col1, right (replicate ('0', 18) + cast (Col2 as varchar(18)), 18) as Col2, right (replicate ('0', 6) + cast (Col3 as varchar(6)), 6) as Col3, Col5, right (replicate ('0', 12) + cast (Col6 as varchar(12)), 12) as Col6, right (replicate ('0', 4) + cast (Col7 as varchar(4)), 4) as Col7 from tbTabla;


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.
    sábado, 24 de agosto de 2019 16:04
  • Lo intenté la primera vez que respondiste. Lo ejecuté, y sale lo mismo, hago la consulta me los muestra bien y tal cual en SSM y al exportar ya no es lo mismo.

    El código #1 genera lo que usted solicitó.

    ---

    En BCP, para generar el archivo de texto con TAB como separador de campo, puede montar el siguiente comando:

    -- código #3
    BCP "SELECT Col1, right (replicate ('0', 18) + cast (Col2 as varchar(18)), 18) as Col2, Right (replicate ('0', 6) + cast (Col3 as varchar(6)), 6) as Col3, Col5, right (replicate ('0', 12) + cast (Col6 as varchar(12)), 12) as Col6, right (replicate ('0', 4) + cast (Col7 as varchar(4)), 4) as Col7 from testdb.dbo.tbTabla;" queryout consulta.tsv -T -c

    Reemplace testdb con el nombre de la base de datos y tbTabla con el nombre de la tabla.

    ---

    Si desea generar un archivo CSV con los campos delimitados por ", aquí tiene otra solución:

    -- código #4
    BCP "SELECT char(34) + cast (Col1 as varchar(10)) + char(34) + ',' + char(34) + right (replicate ('0', 18) + cast (Col2 as varchar(18)), 18) + char(34) + ',' + char(34) + right (replicate ('0', 6) + cast (Col3 as varchar(6)), 6) + char(34) + ',' + char(34) + Col5 + char(34) + ',' + char(34) + right (replicate ('0', 12) + cast (Col6 as varchar(12)), 12) + char(34) + ',' + char(34) + right (replicate ('0', 4) + cast (Col7 as varchar(4)), 4) + char(34) from testdb.dbo.tbTabla;" queryout consulta.csv -T -c
     

    ---

    No hay errores en la exportación.
    ¿En qué programa está importando el archivo de texto generado?

      


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    sábado, 24 de agosto de 2019 19:30

Todas las respuestas

  • Me parece que la solución es utilizar la consulta SQL en BCP para formatear valores numéricos con ceros a la izquierda.

    He aquí una sugerencia para el código SQL que inserte en el comando BCP:

    -- código #1
    SELECT Col1, 
           right (replicate ('0', 18) + cast (Col2 as varchar(18)), 18) as Col2,
           right (replicate ('0', 6) + cast (Col3 as varchar(6)), 6) as Col3,
           Col5,
           right (replicate ('0', 12) + cast (Col6 as varchar(12)), 12) as Col6,
           right (replicate ('0', 4) + cast (Col7 as varchar(4)), 4) as Col7
      from ...
     

    La sugerencia anterior considera que las columnas Col2, Col3, Col6 y Col7 se declararon con un tipo de datos numérico.

    Evaluar el uso de la función STR() en lugar de la función CAST() si alguna columna ha sido declarada como float.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    sábado, 24 de agosto de 2019 11:36
  • Creo que no es lo que busco José, mi problema es mantener los ceros, no borrarlos. No sé si alguna opción sea directamente en excel.
    sábado, 24 de agosto de 2019 15:14

  • La solución que propuse no borra los ceros, sino que formatea según el modelo de resultado que has publicado.

    -- código #2
    USE tempDB;
    
    CREATE TABLE tbTabla (Col1 int, Col2 bigint, Col3 int, Col5 char(4), Col6 int, Col7 int);
    go
    
    INSERT into tbTabla values
    (520602, 10895970150100, 10, 'RR01', 101089597, 1),
    (520602, 13971560150100, 13, 'RR01', 101397156, 1),
    (520602, 18317370110100, 18, 'RR01', 101831737, 1),
    (520602, 24177760100100, 24, 'RR01', 102417776, 1);
    go
    
    --
    SELECT * from tbTabla;
    --
    SELECT Col1, right (replicate ('0', 18) + cast (Col2 as varchar(18)), 18) as Col2, right (replicate ('0', 6) + cast (Col3 as varchar(6)), 6) as Col3, Col5, right (replicate ('0', 12) + cast (Col6 as varchar(12)), 12) as Col6, right (replicate ('0', 4) + cast (Col7 as varchar(4)), 4) as Col7 from tbTabla;


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.
    sábado, 24 de agosto de 2019 16:04
  • Lo intenté la primera vez que respondiste. Lo ejecuté, y sale lo mismo, hago la consulta me los muestra bien y tal cual en SSM y al exportar ya no es lo mismo.
    sábado, 24 de agosto de 2019 17:47
  • Lo intenté la primera vez que respondiste. Lo ejecuté, y sale lo mismo, hago la consulta me los muestra bien y tal cual en SSM y al exportar ya no es lo mismo.

    El código #1 genera lo que usted solicitó.

    ---

    En BCP, para generar el archivo de texto con TAB como separador de campo, puede montar el siguiente comando:

    -- código #3
    BCP "SELECT Col1, right (replicate ('0', 18) + cast (Col2 as varchar(18)), 18) as Col2, Right (replicate ('0', 6) + cast (Col3 as varchar(6)), 6) as Col3, Col5, right (replicate ('0', 12) + cast (Col6 as varchar(12)), 12) as Col6, right (replicate ('0', 4) + cast (Col7 as varchar(4)), 4) as Col7 from testdb.dbo.tbTabla;" queryout consulta.tsv -T -c

    Reemplace testdb con el nombre de la base de datos y tbTabla con el nombre de la tabla.

    ---

    Si desea generar un archivo CSV con los campos delimitados por ", aquí tiene otra solución:

    -- código #4
    BCP "SELECT char(34) + cast (Col1 as varchar(10)) + char(34) + ',' + char(34) + right (replicate ('0', 18) + cast (Col2 as varchar(18)), 18) + char(34) + ',' + char(34) + right (replicate ('0', 6) + cast (Col3 as varchar(6)), 6) + char(34) + ',' + char(34) + Col5 + char(34) + ',' + char(34) + right (replicate ('0', 12) + cast (Col6 as varchar(12)), 12) + char(34) + ',' + char(34) + right (replicate ('0', 4) + cast (Col7 as varchar(4)), 4) + char(34) from testdb.dbo.tbTabla;" queryout consulta.csv -T -c
     

    ---

    No hay errores en la exportación.
    ¿En qué programa está importando el archivo de texto generado?

      


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    sábado, 24 de agosto de 2019 19:30
  • Gracias, pero creo que algo que no especifiqué al inicio, es que mi exportación final tiene que ser obligatoriamente a excel. Desde el inicio he estado usando el .txt donde si me los exporta perfectamente, pero ya cambiando de archivo a excel que es lo que quiero, no me guarda todos los ceros. Y además, mi archivo lo quiero sin comillas dobles ni simples.
    lunes, 26 de agosto de 2019 16:42
  • Gracias, pero creo que algo que no especifiqué al inicio, es que mi exportación final tiene que ser obligatoriamente a excel. Desde el inicio he estado usando el .txt donde si me los exporta perfectamente, pero ya cambiando de archivo a excel que es lo que quiero, no me guarda todos los ceros. Y además, mi archivo lo quiero sin comillas dobles ni simples.
    Si va a importar los datos en una hoja de cálculo de Excel, le sugiero que lea el documento Mantener los ceros a la izquierda y grandes cantidades.

    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    miércoles, 28 de agosto de 2019 13:37