GNAF(オーストラリアのロケーションデータセット)を新しいデータベースにインポートするプロセスを自動化しようとしています。 私が午前問題は、私はデータベースに試してみて、私は、データベースを言って、エラーを取得し、それを再作成する際に使用されていることである:SSMSのためSuspended Invoke-SQLcmdクエリ - 使用中のデータベース
Invoke-Sqlcmd : Cannot drop database "GNAF" because it is currently in use. At line:11 char:5
+ Invoke-Sqlcmd -Query "IF EXISTS (SELECT name FROM master.dbo.sysd ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
+ FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand Invoke-Sqlcmd : Database 'GNAF' already exists. Choose a different database name. At line:15 char:5
+ Invoke-Sqlcmd -Query "CREATE DATABASE GNAF" -serverinstance $Serv ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
+ FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
アクティビティモニタでは示しています
これは、呼び出される関数です。
function importQNAF {
$ScriptPath = "C:\Users\owain.esau\Scripts\PowerShell\SQL-Server\TRIS Database Anon\" # change to pwd for live
$QNAFpath1 = ($ScriptPath + "GNAF\G-NAF\G-NAF AUGUST 2017\Standard\")
$QNAFpath2 = ($ScriptPath + "GNAF\G-NAF\G-NAF AUGUST 2017\Authority Code\")
$GNAF_ImportData_Path = ($ScriptPath + "\SQLScripts\GNAF_ImportData.sql")
(Get-Content $GNAF_ImportData_Path).replace("Powershell To Change#1", $QNAFpath1) | Set-Content $GNAF_ImportData_Path
(Get-Content $GNAF_ImportData_Path).replace("Powershell To Change#2", $QNAFpath2) | Set-Content $GNAF_ImportData_Path
## Drop and Create Table
Invoke-Sqlcmd -Query "IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name ='GNAF')
BEGIN
ALTER DATABASE GNAF SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE GNAF;
END
;" -serverinstance $ServerAddress;
Start-Sleep -s 5;
Invoke-Sqlcmd -Query "CREATE DATABASE GNAF" -serverinstance $ServerAddress;
Start-Sleep -s 5;
Invoke-Sqlcmd -InputFile ($ScriptPath + "SQLScripts\GNAF_CreateTables.sql") -serverinstance $ServerAddress;
try {
Invoke-Sqlcmd -InputFile ($ScriptPath + "SQLScripts\GNAF_ImportData.sql") -serverinstance $ServerAddress -querytimeout 0;
} catch {
if ($error -match "Access is denied.") {
Write-Host "[!] ERROR: Access denied to GNAF folder."
Write-Host "----------------------------------------"
Write-Host "You have two options: "
Write-Host ""
Write-Host " 1) Give MSSQLSERVER full access to" $ScriptPath
Write-Host " 2) Copy the1 folder: " $ScriptPath"GNAF to the MSSQL Source folder (C:\Program Files\SQL Server)"
Do {
switch(Read-Host "Please choose an action (1 or 2)") {
1 {
$Acl = (Get-Item $ScriptPath).GetAccessControl('Access');
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("NT SERVICE\MSSQLSERVER", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow");
$Acl.SetAccessRule($Ar);
Set-Acl $ScriptPath $Acl;
importQNAF;
}
2 { Write-Host "Not coded yet"; }
default { "Invalid Entry, must be 1 or 2"; }
}
} Until ($choice -eq 1 -or $choice -eq 2)
}
}
(ゲット・コンテンツ$ GNAF_ImportData_Pathを).replace($ QNAFpath1、「ポウrshellを変更するには#1 ")|セットコンテンツ$ GNAF_ImportData_Path (Get-Content $ GNAF_ImportData_Path).replace($ QNAFpath2、 "Powershell To Change#2")|セット内容$ GNAF_ImportData_Path } 私は実際にSQLサーバーにデータをインポートするために使用していたスクリプトは、このページで見つかったものとほぼ同じです:
それはSSMSで直接正常に動作します。また、私は私のエラーマッチは正しいエラーをピックアップしているとは思わない、代わりにすべてのエラーに一致しています。
---更新------------------------------------------ ----
機能の開始時にMSSQLSERVERサービスを再起動したときに実行されるように管理されています。
問題は今、それがタイムアウトにある: - SSMAで実行5分、このエラーがポップアップする前に
Invoke-Sqlcmd : Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
BULK INSERT [MB_2011] FROM 'C:\Users\owain.esau\OneDrive\Scripts\PowerShell\SQL-Server\TRIS Database Anon\GNAF\G-NAF\G-NAF AUGUST 2017\Standard\ACT_MB_2011_psv.psv' WITH (FIELDTERMINATOR = '|', ROWTERMINATOR =
'\n', FIRSTROW = 2, ROWS_PER_BATCH=100000, TABLOCK)
At line:30 char:9
+ Invoke-Sqlcmd -InputFile ($ScriptPath + "SQLScripts\GNAF_Imp ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
+ FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
それだけで、実際のスクリプトであること実行が約3をとり、約45秒間動作します。
(関数が少し更新されている)
SQL Serverの再起動を停止してくださいます。再起動で「解決済み」の他の問題があります。それはハンマーであなたの親指を打つことによって頭痛を治すようなビットです。確かに、あなたの頭はもはや痛くはありませんが、それは賢明ですか? – vonPryz
私はPowerShellから再起動する方法を知っていたので、これはデータベースのないローカルホスト上にあったので、問題はありませんでした。それを下の提案に切り替えてください。 –