当数据与数据类型不匹配时,如何在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-DataTable
和Write-DataTable
。
答案 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调用查询。