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

时间:2013-09-18 14:32:13

标签: sql sql-server powershell csv error-handling

当数据与数据类型不匹配时,如何在SQL Server上跳过或说“错误”? 例如ID在SQL服务器上有nchar(2),我有csv文件,其中一个数据是'1234'用于ID。 如何在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

2 个答案:

答案 0 :(得分:1)

您可以使用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."
}

答案 1 :(得分:0)

Write-DataTable函数使用的是.NET SqlBulkCopy类http://msdn.microsoft.com/en-us/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调用查询。