恢复SQL数据库-'-'附近的语法不正确

时间:2019-08-23 07:04:10

标签: sql-server powershell

我正在尝试恢复名称为-的数据库。如果名称中没有-,则数据库已正确还原。

如果我将''放在数据库中,则仍然无法使用。我仍在搜索该怎么做,但找不到。

$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;

1 个答案:

答案 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的情况。