Necesito para exportar una bastante grande, tabla de SQL Server ~100 GB para un archivo CSV. Pero en lugar de la salida de un solo archivo csv, que idealmente debería ser de varios archivos decir 10 archivos de cada 10 GB.

Veo BCP tiene una batch_size argumento, pero esto todavía escribe todos los datos en un solo archivo? Hay otras utilidades libres para hacer lo que necesito? Donde el tamaño del archivo puede ser especificado en bytes o el número de filas?

Para poco de contexto, esto es lo que los datos pueden ser combinados con otras fuentes en una Colmena/Hadoop de la plataforma, así que si hay mejores maneras de exportar los datos estoy abierto a sugerencias.

  • Qué versión de SQL Server se utiliza?
  • En 2012 la empresa
InformationsquelleAutor Jon | 2013-07-13

4 Comentarios

  1. 7

    Creo que se podría utilizar SQL 2012 funciones de localización OFFSET y FETCH en conjunción con bcp:

    SELECT *
    FROM Table
    ORDER BY ID --Primary Key
    OFFSET 100000001 ROWS
    FETCH NEXT 100000000 ROWS ONLY
  2. 6

    BCP del batch_size argumento no control de la salida, por desgracia.

    Maneras he hecho este tipo de división:

    1 – Simple pero no repetible: Crear un archivo de comandos (.cmd) que se ejecuta un múltiplo BCPs sobre la mesa para determinados rangos de filas. Probablemente esto requiere una IDENTITY(1,1) base de clave principal en la tabla.

    bcp "SELECT * FROM MyTable WHERE Id BETWEEN 0 AND 10000000" queryout   
    bcp "SELECT * FROM MyTable WHERE Id BETWEEN 10000000 AND 20000000" queryout    

    2 – Simple y repetible, utiliza una gran cantidad de discos: BCP toda la tabla en un solo archivo y el uso split a crear muchos archivos nuevos según sea necesario con un número determinado de bytes en cada uno de los (nota: la división de las líneas, sería una mejor idea de la OMI). El uso de ‘Cygwin’ (GnuWin32 ya no se mantiene) para instalar split y cualquier otra utilidad que desee.

     bcp MyDb.MySchema.MyTable out C:\MyFile.csv -T -w  
     split -b 10737418240 C:\MyFile.csv C:\MySplitFile_  

    Genera los siguientes archivos

     C:\MySplitFile_aaa
     C:\MySplitFile_aab
     

    3 – Complejo, pero repetible, requiere posiblemente inseguro T-SQL: el Uso de la xp_cmdshell función a llamar BCP dentro de un procedimiento almacenado que itera a través de la mesa.

     DECLARE @loop AS INT;   
     --Use WHILE to loop as needed--   
     DECLARE @sql AS VARCHAR(MAX);   
     --Add code to generate dynamic SQL here--   
     DECLARE @bcp AS VARCHAR(MAX);   
     SELECT @bcp='BCP "'[email protected]sql+'" queryout C:\MyFolder\MyFile_'[email protected]loop+'.csv';   

    NOTA FINAL: Si usted está usando alguna de tipo NVARCHAR campos en los datos, entonces usted necesita utilizar el -w bandera y ser conscientes de que la salida será en UTF-16LE. Me gustaría fuertemente recomendamos convertir que a UTF-8 con iconv (de «Cygwin» de nuevo) antes de intentar hacer cualquier cosa con él en Hadoop.

  3. 3

    Si usted tiene una sola ordenable campo de clave principal, usted podía encontrar las claves que definen los límites de las filas que desea, a continuación, SELECCIONE los registros de uso de un lugar que define los límites.

    Es similar a lo que Joe puso para el #1, pero las llaves no necesita ser contiguos ni numérico. El siguiente es un ejemplo sencillo:

    DECLARE @maxrowsperfile AS bigint = 1048576
    DECLARE boundaries CURSOR FOR
        SELECT the_sortable_key
        FROM
        (
            SELECT
                the_sortable_key
                , ROW_NUMBER() OVER(ORDER BY the_sortable_key) AS the_row_number
            FROM the_table
        ) AS t
        WHERE the_row_number % @maxrowsperfile = 0
    
    OPEN boundaries
    
    DECLARE @lowerbound AS [key type] = [value A]
    DECLARE @upperbound AS [key type] = [value A]
    
    FETCH NEXT FROM boundaries
    INTO @upperbound
    
    IF @lowerbound = @upperbound
        PRINT 'bcp "SELECT * FROM the_table" queryout file -w -T'
    ELSE
        DECLARE @filecount AS int = 1
        BEGIN
            WHILE @@FETCH_STATUS = 0
            BEGIN
                PRINT 'bcp "SELECT * FROM the_table WHERE key > ' + CAST(@lowerbound AS varchar) + ' AND key <= ' + CAST(@upperbound AS varchar) + ' queryout file_' + CAST(@filecount AS varchar) + ' -w -T'
                SET @filecount = @filecount + 1
                SET @lowerbound = @upperbound
                FETCH NEXT FROM boundaries
                INTO @upperbound
            END
            PRINT 'bcp "SELECT * FROM table WHERE key > ' + CAST(@lowerbound AS varchar) + ' queryout file_' + CAST(@filecount AS varchar) + ' -w -T'
    
        END
    CLOSE boundaries
    DEALLOCATE boundaries
  4. 1

    Me gustaría exportar el archivo primero y luego se divide externamente. Suponiendo que se está ejecutando en una máquina con Windows, hay varias «free-ware» herramientas por ahí que puede ayudar. Ver esta otra respuesta en Superusuario para obtener más información.

Dejar respuesta

Please enter your comment!
Please enter your name here