Reputation: 55
How to create a database using SQL stored procedure? Why can not I send the database as a variable?
Is there a restriction on sending the database name from the outside? How can I do this if there is such a restriction?
create proc AddDatabase
@Name varchar(100),
@FileName varchar(Max),
@Size int,
@Maxsize int,
@FileGrowth int,
@logName varchar(100),
@LogFileName varchar(Max),
@LogSize int,
@LogMaxsize int,
@LogFileGrowth int)
as
begin
Create database @Name
On Primary
(NAME=@Name
FileName=@FileName,
Size=@size
MaxSize=@Maxsize,
FileGrowth=@FileGrowth
)
log on
(NAME=@logName,
FILENAME=@LogFileName,
SIZE=@LogSize,
MAXSIZE=@LogMaxsize,
FILEGROWTH=@LogFileGrowth
)
end
Upvotes: 1
Views: 4482
Reputation: 771
In MySQL 8.0.31
DROP PROCEDURE IF EXISTS `spCreateDataBase`;
DELIMITER $$
CREATE PROCEDURE `spCreateDataBase`(NAME VARCHAR(255))
BEGIN
SET @DB_CHARSET := ' DEFAULT CHARACTER SET UTF8MB4';
SET @DB_COLLATE := ' DEFAULT COLLATE UTF8MB4_UNICODE_CI';
SET @DROP_DB := CONCAT('DROP DATABASE IF EXISTS ', NAME);
SET @CREATE_DB := CONCAT('CREATE DATABASE ', NAME, @DB_CHARSET, @DB_COLLATE);
PREPARE DROP_STMT FROM @DROP_DB; EXECUTE DROP_STMT; DEALLOCATE PREPARE DROP_STMT;
PREPARE CREATE_STMT FROM @CREATE_DB; EXECUTE CREATE_STMT; DEALLOCATE PREPARE CREATE_STMT;
END$$
DELIMITER ;
Upvotes: 0
Reputation: 95561
The others are right, you need to use Dynamic SQL. This should get you what you're after, however, please note I have not tested this.
CREATE PROC AddDatabase @Name varchar(100),
@FileName varchar(MAX),
@Size int,
@MaxSize int,
@FileGrowth int,
@LogName varchar(100),
@LogFileName varchar(MAX),
@LogSize int,
@LogMaxsize int,
@LogFileGrowth int
AS
DECLARE @SQL nvarchar(MAX), @Params nvarchar(MAX);
SET @SQL = N'
CREATE DATABASE ' + QUOTENAME(@Name) + N' ON PRIMARY
(NAME = @dName,
FILENAME = @dFileName,
SIZE = @dSize,
MAXSIZE = @dMaxSize,
FILEGROWTH = @dFileGrowth)
LOG ON (NAME = @dLogName,
FILENAME = @dLogFileName,
SIZE = @dLogSize,
MAXSIZE = @dLogMaxsize,
FILEGROWTH = @dLogFileGrowth);';
SET @Params = N'@dName varchar(100), @dFileName varchar(MAX), @dSize int, @dMaxSize int, @dFileGrowth int, @dLogName varchar(100), @dLogFileName varchar(MAX), @dLogSize int, @dLogMaxsize int, @dLogFileGrowth int';
EXEC sp_executesql @SQL, @Params, @dName = @Name, @dFileName = @FileName, @dSize = @Size, @dMaxSize = @MaxSize, @dFileGrowth = @FileGrowth, @dLogName = @LogName, @dLogFileName = @LogFileName, @dLogSize = @LogSize, @dLogMaxsize = @LogMaxsize, @dLogFileGrowth = @LogFileGrowth;
GO
Upvotes: 4