修改数据库恢复模式的存储过程不是编译

时间:2017-10-24 11:46:34

标签: sql-server stored-procedures ssis

我正在尝试创建一个通用的存储过程。我正在尝试更改数据库并将恢复模式设置为简单或完整。它将接受数据库名称和模式作为参数。

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

2 个答案:

答案 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