我正在尝试创建一个新的存储过程来执行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
答案 0 :(得分:2)
您无法参数化ALTER DATABASE
语句
正如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
您始终可以指定最大尺寸,但我认为不需要,因为尺寸不会显着影响结算