0

当数据与数据类型不匹配时,如何在 SQL Server 上跳过或说“错误”?例如 IDnchar(2)在 SQL 服务器上,我有 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已定义。

4

2 回答 2

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."
}
于 2013-09-18T17:33:42.293 回答
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 调用查询。

于 2013-09-18T19:51:19.063 回答