sql-server - 恢复数据库:FROM DISK = 变量 + 字符串 -> '+' 附近的语法不正确
问题描述
我的目的是拥有从备份文件恢复数据库的脚本。
USE [master]
DECLARE @backupsFolder NVARCHAR(256) = N'C:\DatabaseBackups\'
RESTORE DATABASE [MY_DB] FROM DISK = @backupsFolder + 'MY_DB.bak'enter code here
执行时出现错误:
'+' 附近的语法不正确。
问题只是连接路径时。只有变量或只有字符串可以正常工作。我也试过用括号括起来 - >仍然不起作用。添加这样的变量对我来说没什么大不了的:
DECLARE @bakPath NVARCHAR(256) = @backupsFolder + 'MY_DB.bak'
有趣的是,为什么 SQL Server 不允许我在 DISK = 之后立即连接值?
解决方案
您必须使用动态 SQL 来执行此操作。这应该足以让你开始:
DECLARE @backupsFolder NVARCHAR(256) = N'C:\DatabaseBackups\'
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'RESTORE DATABASE [MY_DB] FROM DISK = ' + REPLACE(@backupsFolder,N'''',N'''''') + 'MY_DB.bak --enter code here';
EXEC sp_executesql @SQL;
注意我通常会使用QUOTENAME
而不是REPLACE
最小化注入,但是,文件路径可以(并且确实)有超过 128 个字符。
推荐阅读
- android - 我正在使用 Firebase 实时数据库。我想在 Firebase 上列出升序
- javascript - 任何人都可以在不破坏按钮工作的情况下修复此向下载按钮添加样式
- python - OpenCV实时相机图像不动
- typescript - 是否可以有一个使用索引(类型或对象)的通用约束?
- android-studio - 安装新的 parse sdk 时 Android Studio 抛出错误
- node.js - 在下面的代码中使用 Express GET 方法和 HTTPS GET 方法有什么区别?
- c# - 我的 ListView 不会从 ObservableCollection 中读取项目
由普通列表制成 - php - 为什么 PHP 假定会话已启动时未启动?
- python - 将多个 CSV 文件转换为 UTF-8 编码
- scala - 在具有给定上下文绑定的嵌套列表中键入擦除