0

データがデータ型と一致しない場合、SQL サーバーでスキップまたは「エラー」と言うにはどうすればよいですか? IDなどはnchar(2)SQLサーバーにあり、データの1つがIDの「1234」であるcsvファイルがあります。SQLサーバーでそのデータのエラーサインまたはエラーレポートを取得するにはどうすればよいですか. すべてのエラーについて個別の 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 関数は、T-SQL BULK INSERT コマンドや一部のデータ読み込みとは異なり、.NET SqlBulkCopy クラスhttp://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspxを使用しています。 SSIS のようなユーティリティでは、一部の行をコミットしてエラー行をログに記録するオプションはありません。-BatchSize パラメータを 50,000 ではなく 1 に変更すると、バッチ全体をロールバックする代わりに各行がコミットされ、例外をキャッチできます。注: これは、大規模なデータセットでは遅くなります。

もう 1 つの解決策は、エラー ファイルを指定する 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 に答える