我正在尝试创建一个通用的存储过程。我正在尝试更改数据库并将恢复模式设置为简单或完整。它将接受数据库名称和模式作为参数。
SQL查询在master数据库的上下文中执行,并更改指定的数据库。我试图通过SSIS中的执行SQL任务合并它。我需要存储过程驻留在将要执行操作的数据库中。不确定这是怎么回事。存储过程中不允许使用USE
数据库关键字...
原始查询工作正常,但我在尝试在数据库中执行存储过程时遇到问题。它说“恢复”'不是公认的SET选项。
原始查询:
use master
ALTER DATABASE XYZ
SET RECOVERY FULL
存储过程:
USE XYZ
GO
CREATE PROCEDURE DatabaseRecoveryMode
(@mode varchar(10),
@database varchar(50))
AS
BEGIN
ALTER DATABASE @database
SET RECOVERY @mode
END
答案 0 :(得分:1)
ALTER DATABASE documentation表示恢复模型是关键字,而不是变量。您需要为此构建并执行动态SQL语句。
CREATE PROCEDURE dbo.DatabaseRecoveryMode
(
@mode nvarchar(11),
@database sysname
)
AS
IF @mode NOT IN(N'SIMPLE', N'BULK_LOGGED', N'FULL')
BEGIN
RAISERROR('Recovery model must be SIMPLE, BULK_LOGGED, OR FULL', 16, 1);
RETURN 1;
END;
DECLARE @SQL nvarchar(MAX) = N'ALTER DATABASE '
+ QUOTENAME(@database)
+ N' SET RECOVERY '+ @mode + N';';
EXECUTE(@SQL);
GO
答案 1 :(得分:0)
您需要使用动态SQL
USE XYZ
GO
Create Procedure DatabaseRecoveryMode
(
@mode varchar(10),
@database varchar(50)
)
AS
begin
DECLARE @SQL NVARCHAR(MAX)
DECLARE @db NVARCHAR(60), @Use NVARCHAR(100)
SET @db = N'master'
SET @Use = N'Use ' + @db
SET @SQL = @Use + N' ALTER DATABASE '+ @database + N' SET RECOVERY ' + @mode ;
--SELECT @SQL
EXEC sys.sp_executesql @SQL ;
end
GO