繁体   English   中英

Powershell:将CSV文件导入SQL Server时出错报告

[英]Powershell: error report while Import CSV file to SQL server

当数据与数据类型不匹配时,如何在SQL Server上跳过或说“错误”? 例如ID在SQL Server上具有nchar(2) ,并且我具有一个csv文件,其中ID的数据之一为“ 1234”。 如何在SQL Server中获得该数据的错误标志或错误报告。 可以为所有错误设置单独的excel文件是可以的。 我只想知道哪些数据出错。

并在没有错误的情况下停止脚本。

这是我的剧本

$today = (get-date).Date
$DataImport = Import-Csv -Path (Get-ChildItem filename | where { $_.CreationTime.Date -eq $today } )    
$DataTable = Out-DataTable -InputObject $DataImport
write-DataTable -serverInstance servername -Database DBname -TableName Table name -Data $DataTable

已定义函数Out-DataTableWrite-DataTable

您可以使用TRY和CATCH。

$today = (get-date).Date
TRY
{
$DataImport = Import-Csv -Path (Get-ChildItem filename | where { $_.CreationTime.Date -eq $today } )    
$DataTable = Out-DataTable -InputObject $DataImport
write-DataTable -serverInstance servername -Database DBname -TableName Table name    -Data $DataTable
}
CATCH 
{     
$_.Exception.Message
"PS code here that writes error to txt or to excel."
}

Write-DataTable函数使用.NET SqlBulkCopy类http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlbulkcopy.aspx ,这与T-SQL BULK INSERT命令或某些数据加载不同SSIS之类的实用程序,无法选择提交某些行并记录错误行。 您可以将-BatchSize参数更改为1而不是50,000,这样,它将提交每一行,而不是回滚整个批处理,您可以捕获异常。 注意:对于大型数据集,这会比较慢。

另一种解决方案是使用T-SQL BULK INSERT命令指定错误文件:

$query = "BULK INSERT dbname..table FROM 'C:\temp\test.csv' WITH (FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', ERRORFILE = 'C:\temp\test.err')"

然后使用invoke-sqlcmd或sqlcmd.exe调用查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM