【问题标题】:Powershell: error report while Import CSV file to SQL serverPowershell:将 CSV 文件导入 SQL 服务器时出现错误报告
【发布时间】:2013-09-23 09:06:18
【问题描述】:

当数据与数据类型不匹配时,如何在 SQL Server 上跳过或说“错误”? 例如 ID 在 SQL 服务器上有 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

【问题讨论】:

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


【解决方案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."
}

【讨论】:

    【解决方案2】:

    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 调用查询。

    【讨论】:

      猜你喜欢
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多