2013-09-18 1 views
0

Как я могу пропустить или сказать «ошибка» на SQL-сервере, когда данные не совпадают с типом данных? , такой как ID, имеет nchar(2) на SQL-сервере, и у меня есть файл csv, для которого один из данных «1234» для ID. Как я могу получить сообщение об ошибке или сообщение об ошибке для этих данных на SQL-сервере. Это нормально, что я могу иметь отдельный файл excel обо всех ошибках. Я просто хочу знать, какие данные получили ошибку.Powershell: отчет об ошибке при импортировании CSV-файла на SQL-сервер

И сделать сценарий без остановки, даже если есть ошибка.

Вот мой сценарий

$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

Вы видели это - http://stackoverflow.com/questions/4766250/powershellhow-to-catch-the-error-cause-by-invoke-sqlcmd? – Leptonator

ответ

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." 
} 
0

Write-DataTable функция использует класс .NET SqlBulkCopy http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx, в отличие от команды BULK INSERT T-SQL или некоторых загрузки данных утилиты, как 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')" 

Затем вызовите запрос с помощью вызова-SQLCMD или sqlcmd.exe.

+0

Масштаб не работает из-за разрешения – user2744565

Смежные вопросы