Bilal Günaydın
Bilal Günaydın

Reputation: 55

How to create a database using SQL stored procedure?

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

Answers (2)

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

Thom A
Thom A

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

Related Questions