更改存储过程中的数据库

时间:2015-04-17 10:54:23

标签: sql sql-server azure-sql-database

我正在尝试创建一个新的存储过程来执行Alter Database命令来修改数据库服务层。

所以,我试图创建存储过程,但它不起作用并返回错误

  

'('。

附近的语法不正确

有人能告诉我怎么办?或者语法错误在哪里? 我已经从任何存储过程中运行了这个并且它有效。

提前致谢。

create procedure spChangeTiersDB 
    @MaxSize varchar(8), 
    @Edition varchar(20), 
    @Service varchar(5)
as
begin
     ALTER DATABASE DB_Name 
     MODIFY (
     MAXSIZE = @MaxSize,  
     EDITION = @Edition,
     SERVICE_OBJECTIVE = @Service)
end

3 个答案:

答案 0 :(得分:2)

您无法参数化ALTER DATABASE语句

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/578d87fa-9939-4cb0-bb72-e37cee8abf25/can-i-pass-parameter-to-an-alter-database-command

正如MSDN论坛链接中所建议的那样,使用动态SQL

CREATE PROCEDURE spChangeDBtier 
@MaxSize VARCHAR(10),@Edition VARCHAR(10),@Service VARCHAR(10) AS BEGIN
DECLARE @SQL  NVARCHAR(MAX)
SET @SQL = CONCAT('ALTER DATABASE dbname MODIFY ( MAXSIZE =',@MaxSize,'GB, Edition = ''',@Edition,''',SERVICE_OBJECTIVE = ''',@Service,''')')
EXEC(@SQL)
END

示例执行:

spChangeDBtier '500','PREMIUM','P1'

答案 1 :(得分:0)

似乎我们不能用无人看管的东西来做这些改变,比如存储过程,函数等等。所以,我在C#中做了一些改变从服务器改变的东西。这是我目前的答案。如果其他人有同样的问题,这里有帮助的代码。

    public static bool ChangeDBTier(string DbName, string MaxSize, string Edition, string Service)
    {
        try
        {
            using (SqlConnection con = new SqlConnection(ConnectionString))
            {
                con.Open();
                String sqlCommandText = @"ALTER DATABASE " + DbName + " MODIFY (MAXSIZE = " + MaxSize + ", EDITION = '" + Edition + "', SERVICE_OBJECTIVE = '" + Service + "')";
                SqlCommand sqlCommand = new SqlCommand(sqlCommandText, con);
                sqlCommand.ExecuteNonQuery();
            }
            return true;
        }
        catch
        {
            return false;
        }
    }

答案 2 :(得分:0)

CREATE PROCEDURE #spChangeDBtier  @MaxSize VARCHAR(10),@ Edition VARCHAR(10),@ Service VARCHAR(10)AS BEGIN DECLARE @SQL NVARCHAR(MAX) 设置@sql ='alter database test modify(maxsize ='+ @MaxSize +',edition ='''+ @MaxSize +''',service_objective ='''+ @MaxSize +''')' EXEC @SQL END

您始终可以指定最大尺寸,但我认为不需要,因为尺寸不会显着影响结算