2013-04-17 4 views
0

У меня есть несколько таблиц в базе данных, которые содержат огромное количество данных. Моя потребностьЭкспорт данных из базы данных

1: Запросить данные существует более одного года.

2: Экспорт и архивирование их в файл.

3: В любой момент времени я могу вставить эти данные обратно в базу данных.

Данные могут содержать или не содержать COMMA, поэтому не уверены, должен ли я экспортировать их в формат csv.

Какой формат файлов лучше всего подходит?

Какое должно быть ограничение размера файла здесь?

ответ

0

Этот скрипт экспортирует строки из указанных таблиц в оператор INSERT для любой структуры таблиц. Таким образом, вы будете просто нужно скопировать результат и запустить его в SQL документе SSMS -

DECLARE 
     @TableName SYSNAME 
    , @ObjectID INT 
    , @IsImportIdentity BIT = 1 

DECLARE [tables] CURSOR READ_ONLY FAST_FORWARD LOCAL FOR 
    SELECT 
      '[' + s.name + '].[' + t.name + ']' 
     , t.[object_id] 
    FROM (
     SELECT DISTINCT 
       t.[schema_id] 
      , t.[object_id] 
      , t.name 
     FROM sys.objects t WITH (NOWAIT) 
     JOIN sys.partitions p WITH (NOWAIT) ON p.[object_id] = t.[object_id] 
     WHERE p.[rows] > 0 
      AND t.[type] = 'U' 
    ) t 
    JOIN sys.schemas s WITH (NOWAIT) ON t.[schema_id] = s.[schema_id] 
    WHERE t.name IN ('<your table name>') 

OPEN [tables] 

FETCH NEXT FROM [tables] INTO 
     @TableName 
    , @ObjectID 

DECLARE 
     @SQLInsert NVARCHAR(MAX) 
    , @SQLColumns NVARCHAR(MAX) 
    , @SQLTinyColumns NVARCHAR(MAX) 

WHILE @@FETCH_STATUS = 0 BEGIN 

    SELECT 
      @SQLInsert = '' 
     , @SQLColumns = '' 
     , @SQLTinyColumns = '' 

    ;WITH cols AS 
    (
     SELECT 
       c.name 
      , datetype = t.name 
      , c.column_id 
     FROM sys.columns c WITH (NOWAIT) 
     JOIN sys.types t WITH (NOWAIT) ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id 
     WHERE c.[object_id] = @ObjectID 
      AND (c.is_identity = 0 OR @IsImportIdentity = 1) 
      AND c.is_computed = 0 
      AND t.name NOT IN ('xml', 'geography', 'geometry', 'hierarchyid') 
    ) 
    SELECT 
      @SQLInsert = 'INSERT INTO ' + @TableName + ' (' + STUFF((
      SELECT ', [' + c.name + ']' 
      FROM cols c 
      ORDER BY c.column_id 
      FOR XML PATH, TYPE, ROOT).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + ')' 
     , @SQLTinyColumns = STUFF((
      SELECT ', ' + c.name 
      FROM cols c 
      ORDER BY c.column_id 
      FOR XML PATH, TYPE, ROOT).value('.', 'NVARCHAR(MAX)'), 1, 2, '') 
     , @SQLColumns = STUFF((SELECT CHAR(13) + 
      CASE 
       WHEN c.datetype = 'uniqueidentifier' 
        THEN ' + '', '' + ISNULL('''''''' + CAST([' + c.name + '] AS VARCHAR(MAX)) + '''''''', ''NULL'')' 
       WHEN c.datetype IN ('nvarchar', 'varchar', 'nchar', 'char', 'varbinary', 'binary') 
        THEN ' + '', '' + ISNULL('''''''' + CAST(REPLACE([' + c.name + '], '''''''', '''''''''''') AS NVARCHAR(MAX)) + '''''''', ''NULL'')' 
       WHEN c.datetype = 'datetime' 
        THEN ' + '', '' + ISNULL('''''''' + CONVERT(VARCHAR, [' + c.name + '], 120) + '''''''', ''NULL'')' 
       ELSE 
       ' + '', '' + ISNULL(CAST([' + c.name + '] AS NVARCHAR(MAX)), ''NULL'')' 
      END 
      FROM cols c 
      ORDER BY c.column_id 
      FOR XML PATH, TYPE, ROOT).value('.', 'NVARCHAR(MAX)'), 1, 10, 'CHAR(13) + '', ('' +') 

    DECLARE @SQL NVARCHAR(MAX) = '  
    SET NOCOUNT ON; 
    DECLARE 
      @SQL NVARCHAR(MAX) = '''' 
     , @x INT = 1 
     , @count INT = (SELECT COUNT(1) FROM ' + @TableName + ') 

    IF EXISTS(
     SELECT 1 
     FROM tempdb.dbo.sysobjects 
     WHERE ID = OBJECT_ID(''tempdb..#import'') 
    ) 
     DROP TABLE #import; 

    SELECT ' + @SQLTinyColumns + ', ''RowNumber'' = ROW_NUMBER() OVER (ORDER BY ' + @SQLTinyColumns + ') 
    INTO #import 
    FROM ' + @TableName + ' 

    WHILE @x < @count BEGIN 

     SELECT @SQL = ''VALUES '' + STUFF((
     SELECT ' + @SQLColumns + ' + '')''' + ' 
     FROM #import 
     WHERE RowNumber BETWEEN @x AND @x + 9 
     FOR XML PATH, TYPE, ROOT).value(''.'', ''NVARCHAR(MAX)''), 1, 2, CHAR(13) + '' '') + '';'' 

     PRINT(''' + @SQLInsert + ''') 
     PRINT(@SQL) 

     SELECT @x = @x + 10 

    END' 

    EXEC sys.sp_executesql @SQL 

    FETCH NEXT FROM [tables] INTO 
      @TableName 
     , @ObjectID 

END 

CLOSE [tables] 
DEALLOCATE [tables] 

В выходе вы получите что-то вроде этого (AdventureWorks.Person.Address):

INSERT INTO [Person].[Address] ([AddressID], [AddressLine1], [AddressLine2], [City], [StateProvinceID], [PostalCode], [rowguid], [ModifiedDate]) 
VALUES 
    (1, '1970 Napa Ct.', NULL, 'Bothell', 79, '98011', '9AADCB0D-36CF-483F-84D8-585C2D4EC6E9', '2002-01-04 00:00:00') 
, (2, '9833 Mt. Dias Blv.', NULL, 'Bothell', 79, '98011', '32A54B9E-E034-4BFB-B573-A71CDE60D8C0', '2003-01-01 00:00:00') 
, (3, '7484 Roundtree Drive', NULL, 'Bothell', 79, '98011', '4C506923-6D1B-452C-A07C-BAA6F5B142A4', '2007-04-08 00:00:00') 
, (4, '9539 Glenside Dr', NULL, 'Bothell', 79, '98011', 'E5946C78-4BCC-477F-9FA1-CC09DE16A880', '2003-03-07 00:00:00') 
, (5, '1226 Shoe St.', NULL, 'Bothell', 79, '98011', 'FBAFF937-4A97-4AF0-81FD-B849900E9BB0', '2003-01-20 00:00:00') 
, (6, '1399 Firestone Drive', NULL, 'Bothell', 79, '98011', 'FEBF8191-9804-44C8-877A-33FDE94F0075', '2003-03-17 00:00:00') 
, (7, '5672 Hale Dr.', NULL, 'Bothell', 79, '98011', '0175A174-6C34-4D41-B3C1-4419CD6A0446', '2004-01-12 00:00:00') 
, (8, '6387 Scenic Avenue', NULL, 'Bothell', 79, '98011', '3715E813-4DCA-49E0-8F1C-31857D21F269', '2003-01-18 00:00:00') 
, (9, '8713 Yosemite Ct.', NULL, 'Bothell', 79, '98011', '268AF621-76D7-4C78-9441-144FD139821A', '2006-07-01 00:00:00') 
, (10, '250 Race Court', NULL, 'Bothell', 79, '98011', '0B6B739D-8EB6-4378-8D55-FE196AF34C04', '2003-01-03 00:00:00'); 

UPDATE:

И этот скрипт экспортирует строки из указанных таблиц в формат CSV в окне вывода для любой структуры таблиц.

DECLARE 
     @TableName SYSNAME 
    , @ObjectID INT 

DECLARE [tables] CURSOR READ_ONLY FAST_FORWARD LOCAL FOR 
    SELECT 
      '[' + s.name + '].[' + t.name + ']' 
     , t.[object_id] 
    FROM (
     SELECT DISTINCT 
       t.[schema_id] 
      , t.[object_id] 
      , t.name 
     FROM sys.objects t WITH (NOWAIT) 
     JOIN sys.partitions p WITH (NOWAIT) ON p.[object_id] = t.[object_id] 
     WHERE p.[rows] > 0 
      AND t.[type] = 'U' 
    ) t 
    JOIN sys.schemas s WITH (NOWAIT) ON t.[schema_id] = s.[schema_id] 
    WHERE t.name IN ('<your table name>') 

OPEN [tables] 

FETCH NEXT FROM [tables] INTO 
     @TableName 
    , @ObjectID 

DECLARE 
     @SQLInsert NVARCHAR(MAX) 
    , @SQLColumns NVARCHAR(MAX) 
    , @SQLTinyColumns NVARCHAR(MAX) 

WHILE @@FETCH_STATUS = 0 BEGIN 

    SELECT 
      @SQLInsert = '' 
     , @SQLColumns = '' 
     , @SQLTinyColumns = '' 

    ;WITH cols AS 
    (
     SELECT 
       c.name 
      , datetype = t.name 
      , c.column_id 
     FROM sys.columns c WITH (NOWAIT) 
     JOIN sys.types t WITH (NOWAIT) ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id 
     WHERE c.[object_id] = @ObjectID 
      AND c.is_computed = 0 
      AND t.name NOT IN ('xml', 'geography', 'geometry', 'hierarchyid') 
    ) 
    SELECT 
      @SQLTinyColumns = STUFF((
      SELECT ', [' + c.name + ']' 
      FROM cols c 
      ORDER BY c.column_id 
      FOR XML PATH, TYPE, ROOT).value('.', 'NVARCHAR(MAX)'), 1, 2, '') 
     , @SQLColumns = STUFF((SELECT CHAR(13) + 
      CASE 
       WHEN c.datetype = 'uniqueidentifier' 
        THEN ' + '';'' + ISNULL('''' + CAST([' + c.name + '] AS VARCHAR(MAX)) + '''', ''NULL'')' 
       WHEN c.datetype IN ('nvarchar', 'varchar', 'nchar', 'char', 'varbinary', 'binary') 
        THEN ' + '';'' + ISNULL('''' + CAST(REPLACE([' + c.name + '], '''', '''''''') AS NVARCHAR(MAX)) + '''', ''NULL'')' 
       WHEN c.datetype = 'datetime' 
        THEN ' + '';'' + ISNULL('''' + CONVERT(VARCHAR, [' + c.name + '], 120) + '''', ''NULL'')' 
       ELSE 
       ' + '';'' + ISNULL(CAST([' + c.name + '] AS NVARCHAR(MAX)), ''NULL'')' 
      END 
      FROM cols c 
      ORDER BY c.column_id 
      FOR XML PATH, TYPE, ROOT).value('.', 'NVARCHAR(MAX)'), 1, 10, 'CHAR(13) + '''' +') 

    DECLARE @SQL NVARCHAR(MAX) = '  
    SET NOCOUNT ON; 
    DECLARE 
      @SQL NVARCHAR(MAX) = '''' 
     , @x INT = 1 
     , @count INT = (SELECT COUNT(1) FROM ' + @TableName + ') 

    IF EXISTS(
     SELECT 1 
     FROM tempdb.dbo.sysobjects 
     WHERE ID = OBJECT_ID(''tempdb..#import'') 
    ) 
     DROP TABLE #import; 

    SELECT ' + @SQLTinyColumns + ', ''RowNumber'' = ROW_NUMBER() OVER (ORDER BY ' + @SQLTinyColumns + ') 
    INTO #import 
    FROM ' + @TableName + ' 

    WHILE @x < @count BEGIN 

     SELECT @SQL = STUFF((
     SELECT ' + @SQLColumns + ' + ''''' + ' 
     FROM #import 
     WHERE RowNumber BETWEEN @x AND @x + 9 
     FOR XML PATH, TYPE, ROOT).value(''.'', ''NVARCHAR(MAX)''), 1, 1, '''') 

     PRINT(@SQL) 

     SELECT @x = @x + 10 

    END' 

    EXEC sys.sp_executesql @SQL 

    FETCH NEXT FROM [tables] INTO 
      @TableName 
     , @ObjectID 

END 

CLOSE [tables] 
DEALLOCATE [tables] 

В выходе вы получите что-то вроде этого (AdventureWorks.Person.Person):

1;EM;0;NULL;Ken;J;Sánchez;NULL;0;92C4279F-1207-48A3-8448-4636514EB7E2;2003-02-08 00:00:00 
2;EM;0;NULL;Terri;Lee;Duffy;NULL;1;D8763459-8AA8-47CC-AFF7-C9079AF79033;2002-02-24 00:00:00 
3;EM;0;NULL;Roberto;NULL;Tamburello;NULL;0;E1A2555E-0828-434B-A33B-6F38136A37DE;2001-12-05 00:00:00 
4;EM;0;NULL;Rob;NULL;Walters;NULL;0;F2D7CE06-38B3-4357-805B-F4B6B71C01FF;2001-12-29 00:00:00 
5;EM;0;Ms.;Gail;A;Erickson;NULL;0;F3A3F6B4-AE3B-430C-A754-9F2231BA6FEF;2002-01-30 00:00:00 
6;EM;0;Mr.;Jossef;H;Goldberg;NULL;0;0DEA28FD-EFFE-482A-AFD3-B7E8F199D56F;2002-02-17 00:00:00 
+0

Я хочу процесс экспорта записей какую-нибудь файловую систему .. и вставьте их обратно, если нужно ... Сценарий, который вы указали, похоже, перемещает его из таблицы в таблицу. – James

+0

Вскоре я добавлю еще один пример для экспорта в csv. – Devart

+0

ok..So Я правильно слежу за вами. Спасибо – James

0

Попробуйте использовать утилиту командной строки bcp, который очень эффективен при обработке импорта/экспорта для больших наборов данных :

BCP "выберите * из [YourTable]" queryout data.dat -n -S ваш_сервер -d "YourDatabase" -T

-T означает доверенную аутентификацию. -n означает собственный формат, поэтому вам не нужно беспокоиться о типах данных, запятых и т. д. Однако это означает, что вы не можете просматривать данные в редакторе; он доступен только для загрузки обратно в SQL Server. Вместо этого вы можете использовать -c, если хотите формат CSV.

Чтобы импортировать обратно в:

БКП "[YourTable]" в data.dat -n -S ваш_сервер -d "YourDatabase" -T

Смежные вопросы