Byt*_*zed 5 sql-server errors csv bulk-insert
我正在尝试使用批量插入将 .CSV 文件导入到 mssql 表中(尽管我对其他方法持开放态度)。我有一个批量插入 sql 语句,但是当我执行文件时它说(0 行受影响)。但是,我在文件本身中有数据。
示例 CSV 文件(标题 + 标题下方的一行)
.CSV 标题
更改,停用,锁定,noemail,empno,orighire,薪水,salut,fname,mi,lname,用户名,hstreet1,hstreet2,hcity,hstate,hcountry,hzip,busphone,busext,蜂窝,empemail,职位,工作代码,工作组, orglevel1,orglevel2,orglevel3,orglevel4,orglevel5,company,perfdate,supervisor,misc1,misc2,misc3,misc4,active
.CSV 内容
2014-04-03 00:00:00,NO ,NO ,NO ,1133,2014-04-03 00:00:00,1111.1111,,test,test,test,user.test,111 测试方式,,萨克拉门托, CA,USA,11111,,,,test@test.org,test test,057,02,sss,261,SAC,,test,ttt,1911-11-11 00:00:00,1111,N,,test ,0,NULL
.SQL
BULK
INSERT dbo.Archive
FROM 'C:\scripts\User.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\r\n',
FIRSTROW = 2
)
GO
Run Code Online (Sandbox Code Playgroud)
我试图通过 ps 实现这一点,这是结果和代码:
# Database variables
$sqlserver = "dbserver"
$database = "db"
$table = "tb"
# CSV variables
$csvfile = "C:\scripts\User.csv"
$csvdelimiter = ","
$firstRowColumnNames = $true
################### No need to modify anything below ###################
Write-Host "Script 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;"
$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 "Script complete. $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.
[System.GC]::Collect()
Run Code Online (Sandbox Code Playgroud)
错误
PS C:\scripts> C:\scripts\Import-CSVtoSQL.ps1 脚本已启动...使用“1”参数调用“WriteToServer”时出现异常:“从 bcp 客户端接收到了 colid 38 的无效列长度。” 在 C:\scripts\Import-CSVtoSQL.ps1:51 char:2 + $bulkcopy.WriteToServer($datatable) + ~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException +fullyQualifiedErrorId : SqlException
在我尝试导入的表中,我有一些额外的列。IE:Datestamp
,batch number
。表中的内容多于 csv 文件肯定是问题所在。我导入到一个临时表,该表仅包含 csv 中定义的列并且有效。
归档时间: |
|
查看次数: |
12646 次 |
最近记录: |