Функция Powershell для импорта файла CSV в таблицу базы данных SQL Server - PullRequest
2 голосов
/ 01 мая 2019

Я создал функцию PowerShell, которая массово копирует данные из файла .csv (первая строка - заголовок) и вставляет данные в таблицу базы данных SQL Server.

Смотри мой код:

function BulkCsvImport($sqlserver, $database, $table, $csvfile, $csvdelimiter, $firstrowcolumnnames) {
    Write-Host "Bulk Import Started." 
    $elapsed = [System.Diagnostics.Stopwatch]::StartNew()  
    [void][Reflection.Assembly]::LoadWithPartialName("System.Data") 
    [void][Reflection.Assembly]::LoadWithPartialName("System.Data.SqlClient") 

    # 50k worked fastest and kept memory usage to a minimum 
    $batchsize = 50000 

    # Build the sqlbulkcopy connection, and set the timeout to infinite 
    $connectionstring = "Data Source=$sqlserver;Integrated Security=true;Initial Catalog=$database;" 

    # Wipe the bulk insert table first
    Invoke-Sqlcmd -Query "TRUNCATE TABLE $table" -ServerInstance $sqlserver -Database $database

    $bulkcopy = New-Object Data.SqlClient.SqlBulkCopy($connectionstring, [System.Data.SqlClient.SqlBulkCopyOptions]::TableLock) 
    $bulkcopy.DestinationTableName = $table 
    $bulkcopy.bulkcopyTimeout = 0 
    $bulkcopy.batchsize = $batchsize 

    # Create the datatable, and autogenerate the columns. 
    $datatable = New-Object System.Data.DataTable 

    # Open the text file from disk 
    $reader = New-Object System.IO.StreamReader($csvfile) 
    $columns = (Get-Content $csvfile -First 1).Split($csvdelimiter) 

    if ($firstrowcolumnnames -eq $true) { $null = $reader.readLine() } 

    foreach ($column in $columns) {  
        $null = $datatable.Columns.Add() 
    } 

    # Read in the data, line by line 
    while (($line = $reader.ReadLine()) -ne $null)  { 
        $null = $datatable.Rows.Add($line.Split($csvdelimiter)) 

        $i++; 
        if (($i % $batchsize) -eq 0) {  
            $bulkcopy.WriteToServer($datatable)  
            Write-Host "$i rows have been inserted in $($elapsed.Elapsed.ToString())." 
            $datatable.Clear()  
        }  
    }  

    # Add in all the remaining rows since the last clear 
    if($datatable.Rows.Count -gt 0) { 
        $bulkcopy.WriteToServer($datatable) 
        $datatable.Clear() 
    } 

    # Clean Up 
    $reader.Close(); 
    $reader.Dispose() 

    $bulkcopy.Close(); 
    $bulkcopy.Dispose() 

    $datatable.Dispose() 

    Write-Host "Bulk Import Completed. $i rows have been inserted into the database." 
    # Write-Host "Total Elapsed Time: $($elapsed.Elapsed.ToString())" 
    # Sometimes the Garbage Collector takes too long to clear the huge datatable. 
    $i = 0
    [System.GC]::Collect()
}

Я хочу изменить приведенное выше, чтобы имена столбцов в файле .csv совпадали с именами столбцов в таблице базы данных SQL Server. Они должны быть идентичны. В данный момент данные импортируются в неправильные столбцы базы данных.

Могу ли я получить некоторую помощь, как то, что мне нужно сделать, чтобы изменить вышеуказанную функцию для достижения этой цели?

1 Ответ

0 голосов
/ 01 мая 2019

Я бы использовал существующее решение с открытым исходным кодом:

Import-DbaCsv - dbatools.io

Import-DbaCsv.ps1

Эффективно импортирует очень большие (и маленькие) файлы CSV в SQL Server.

Import-DbaCsv использует преимущества суперскоростного класса .NET SqlBulkCopy для импорта файлов CSV в SQL Server.


Параметры:

-ColumnMap

По умолчанию массовая копия пытается автоматизировать столбцы.Если он не работает должным образом, этот параметр поможет.

PS C:\> $columns = @{
>> Text = 'FirstName'
>> Number = 'PhoneNumber'
>> }
PS C:\> Import-DbaCsv -Path c:\temp\supersmall.csv 
        -SqlInstance sql2016 -Database tempdb -ColumnMap $columns 
        -BatchSize 50000 -Table table_name -Truncate

Столбец CSV «Текст» вставляется в столбец SQL «FirstName», а номер столбца CSV - встолбец SQL «PhoneNumber».Все остальные столбцы игнорируются и поэтому имеют значения NULL или значения по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...