[英]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-DataTable
和Write-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.