我正在尝试恢复名称为-
的数据库。如果名称中没有-
,则数据库已正确还原。
如果我将''
放在数据库中,则仍然无法使用。我仍在搜索该怎么做,但找不到。
$sqlRestoreCommand.CommandText = "RESTORE DATABASE '$databaseName' FROM DISK = '$databaseBackup' " ;
发生以下异常,并且代码如下:
异常:参数为“ 0”的调用“ ExecuteNonQuery”的异常:“'-'附近的语法不正确。 关键字“ with”附近的语法不正确。如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则前一条语句必须以分号终止。“。Exception.Message
$databaseName = "TempRpc-RC";
# Write the state for debugging purposes.
"SQL State" > sqlstatelog.txt;
$connection.State >> sqlstatelog.txt;
# Create the SQL restore command.
$sqlRestoreCommand = $connection.CreateCommand();
# Set the command text to a SQL restore command and fill in the parameters.
# With move option is needed!
$sqlRestoreCommand.CommandText = "RESTORE DATABASE $databaseName FROM DISK = '$databaseBackup' " ;
$sqlRestoreCommand.CommandText += "WITH FILE = 1, ";
$sqlRestoreCommand.CommandText += "MOVE N'$databaseName" + "'" + " TO N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\Data\$databaseName" + "_Data.mdf', ";
$sqlRestoreCommand.CommandText += "MOVE N'$databaseName" + "_log'" +" TO N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\Data\$databaseName" +"_Log.ldf'";
$sqlRestoreCommand.Connection = $connection;
# Execute the commands.
$sqlRestoreResult = $sqlRestoreCommand.ExecuteNonQuery();
# Write the query
Write-Verbose $sqlRestoreCommand.CommandText;
答案 0 :(得分:1)
tl;博士:
在定义查询字符串的可扩展PowerShell字符串("..."
)内,将'$databaseName'
替换为[$databaseName]
顺便说一句:除非您完全控制用于构造查询字符串的所有部分,否则应使用parameters来避免SQL注入攻击,如Ansgar所建议。
Ansgar Wiechers提供了关键的指针:
由于您的数据库名称包含-
字符,因此它不是regular identifier,因此必须用引号/定界,即必须将其指定为定界标识符。
此外,与reserved keywords冲突的标识符也必须指定为分隔标识符。
定界标识符是用[...]
或"..."
括起来的标识符;相反,不支持'...'
,可以解释您的症状。
注意:[...]
是特定于SQL Server的,但在那里始终受 的支持,而仅当"..."
受支持时才支持标准SET QUOTED_IDENTIFIER ON
在T-SQL中有效,默认情况下是这样-但是在某些情况下,例如在不使用sqlcmd.exe
的情况下使用-l
的情况。