まあ、これは非常に古い投稿であり、Microsoft の人々がこの問題を修正したと言っていることは知っています (David Brabant が言及した記事によると)。 .
Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) を実行しても同じ問題が発生し、いくつかの調査を行った後、Invoke-Sqlcmd からいくつかのパラメーターを出力として取得する方法を得たので、現在のセッション ID を取得できます。 SQL Server から組み込みの @@SPID グローバル変数を使用してユーザー プロセスを実行し、ADO.NET と接続して KILL 句を実行し、開いている接続を閉じます。
それでは、私の場合に適用される回避策を見てみましょう
#Invoke the Invoke-Sqlcmd to execute an script from a file
Invoke-Sqlcmd -Server "[SERVER_NAME]" -Database [DATABASE_NAME] -Username [USER] -Password [PASSWORD] -InputFile [DOT_SQL_FILE_PATH]
#Invoke the Invoke-Sqlcmd to execute a inline SQL statement to get the SessionID as a Powershell variable
$SQLSession = Invoke-Sqlcmd -Server "[SERVER_NAME]" -Database [DATABASE_NAME] -Username [USER] -Password [PASSWORD] -query "select @@spid as SessionID"
# Build query to execute KILL clause
$DbQuery = "KILL " + $SQLSession.SessionID;
# Create SQL connection with ADO.NET
$DbConnection = New-Object System.Data.SqlClient.SqlConnection
$DbConnectionString = "Server = [SERVER_NAME]; Database = [DATABASE_NAME]; User ID=[USER]; Password=[PASSWORD];"
$DbConnection.ConnectionString = $DbConnectionString
$DbConnection.Open()
# Create SQL command for KILL clause
$DbCommand = New-Object System.Data.SQLClient.SQLCommand
$DbCommand.Connection = $DbConnection
$DbCommand.CommandText = $DbQuery
# Execute KILL clause
$DbCommand.ExecuteNonQuery()
# Close connection
$DbConnection.Close()
それが役立つことを願っています