Sql server 使用SQL过程在MSSQL中创建数据库

Sql server 使用SQL过程在MSSQL中创建数据库,sql-server,python-3.x,pyodbc,Sql Server,Python 3.x,Pyodbc,嗨,我正在尝试使用下面的SQL过程创建一个数据库 Create_SQL_Proc_Statement = """ CREATE PROCEDURE db_creation_script @DBName nvarchar(50), @data_path nvarchar(50) ='', @data_file_size nvarchar(50) = '5000KB', @data_file_maxsize nv

嗨,我正在尝试使用下面的SQL过程创建一个数据库

Create_SQL_Proc_Statement = """
CREATE PROCEDURE db_creation_script
           @DBName nvarchar(50),
           @data_path nvarchar(50) ='',
           @data_file_size nvarchar(50) = '5000KB',
           @data_file_maxsize nvarchar(50) = 'UNLIMITED',
           @data_file_filegrowth nvarchar(50) = '1024KB',
           @log_path nvarchar(50) ='',
           @log_file_size nvarchar(50) = '5000KB',
           @log_file_maxsize nvarchar(50) = '1048576KB',
           @log_file_filegrowth nvarchar(50) = '1024KB'
AS

begin

           declare @l_variable_data as nvarchar(500);
           declare @l_variable_log as nvarchar(500);
           declare @complete_command as nvarchar(1000);
           declare @print_message as nvarchar(1000);
           declare @error as int;

           --Fetch data path

           if (@data_path ='' OR @data_path is null )
                          SELECT @data_path=cast(SERVERPROPERTY('InstanceDefaultDataPath') as nvarchar);
           if (@data_path ='' OR @data_path is null )

           begin
                          set @error=@@ERROR
                          if (@error<>0)
                          begin
                                         set @print_message=N'Error '+ RTRIM(cast(@error as nvarchar(10))) + ' - Message: '+ ERROR_MESSAGE();
                                         print(@print_message);
                          end
                          else
                                         print('No error is generated');
           end

           --Fetch log path

           if (@log_path ='' OR @log_path is null )
                          SELECT @log_path=cast(SERVERPROPERTY('InstanceDefaultLogPath') as nvarchar);
           if (@log_path ='' OR @log_path is null )
           begin
                          set @error=@@ERROR
                          if (@error<>0)
                          begin
                                         set @print_message=N'Error '+ RTRIM(cast(@error as nvarchar(10))) + ' - Message: '+ ERROR_MESSAGE();
                                         print(@print_message);
                          end
                          else
                                         print('No error is generated');
           end


            set @l_variable_data = concat('NAME =', '''',@DBName, '_DATA','''', ', FILENAME = ', '''', @data_path,'\',@DBName, '.mdf', '''', ', SIZE = ', @data_file_size, ', MAXSIZE = ', @data_file_maxsize,', FILEGROWTH = ',@data_file_filegrowth)
            set @l_variable_log  = concat('NAME =', '''',@DBName, '_LOG', '''', ', FILENAME = ', '''', @log_path, '\',@DBName, '.ldf', '''', ', SIZE = ', @log_file_size, ', MAXSIZE = ',  @log_file_maxsize,', FILEGROWTH = ',@log_file_filegrowth)

           set @complete_command = concat(' CREATE DATABASE ', @DBName , ' CONTAINMENT = NONE ON PRIMARY (', @l_variable_data, ')' , ' LOG ON (' , @l_variable_log , ')');


           exec(@complete_command);

end
"""
我还尝试了以下方法:

cursor.execute('{ call db_creation_script  (?, ?, ?, ?, ?, ?, ?, ?, ?)}',(DB_Name,Data_Path,Data_File_Size,Data_File_Maxsize,Data_File_Filegrowth,Log_Path,Log_File_Size,Log_File_Maxsize,Log_File_Filegrowth))
cursor.execute('exec db_creation_script  {0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}'.format(DB_Name,Data_Path,Data_File_Size,Data_File_Maxsize,Data_File_Filegrowth,Log_Path,Log_File_Size,Log_File_Maxsize,Log_File_Filegrowth))
但运气不好,我总是遇到以下例外:

 cursor.execute('exec db_creation_script  {0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}'.format(DB_Name,Data_Path,Data_File_Size,Data_File_Maxsize,Data_File_Filegrowth,Log_Path,Log_File_Size,Log_File_Maxsize,Log_File_Filegrowth))
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Incorrect syntax near ','. (102) (SQLExecDirectW)")
每次我运行上述代码时,我都会收到一条不成功的消息,您能帮我理解问题在我的脚本中的确切位置吗?如果有人能告诉我是否有其他方法可以做到这一点,那就太好了


注意:我使用pyodbc python模块实现相同的功能

您需要确保字符串对SQLServer有效

这里我做了一些必要的更改,并且在我的实例上创建了存储过程,它是否工作是另一个问题:-)

我故意省略了exec(complete命令)上面的3行,因为要输入的引号太多了:-)

此脚本在SSMS中工作

       DECLARE @Create_SQL_Proc_Statement NVARCHAR(MAX);
       SELECT @Create_SQL_Proc_Statement = N'
       CREATE PROCEDURE db_creation_script
       @DBName nvarchar(50),
       @data_path nvarchar(50) ='''',
       @data_file_size nvarchar(50) = ''5000KB'',
       @data_file_maxsize nvarchar(50) = ''UNLIMITED'',
       @data_file_filegrowth nvarchar(50) = ''1024KB'',
       @log_path nvarchar(50) ='''',
       @log_file_size nvarchar(50) = ''5000KB'',
       @log_file_maxsize nvarchar(50) = ''1048576KB'',
       @log_file_filegrowth nvarchar(50) = ''1024KB''
       AS

       begin

       declare @l_variable_data as nvarchar(500);
       declare @l_variable_log as nvarchar(500);
       declare @complete_command as nvarchar(1000);
       declare @print_message as nvarchar(1000);
       declare @error as int;

       --Fetch data path

       if (@data_path ='''' OR @data_path is null )
                      SELECT @data_path=cast(SERVERPROPERTY(''InstanceDefaultDataPath'') as nvarchar);
       if (@data_path ='''' OR @data_path is null )

       begin
                      set @error=@@ERROR
                      if (@error<>0)
                      begin
                                     set @print_message=N''Error ''+ RTRIM(cast(@error as nvarchar(10))) + '' - Message: ''+ ERROR_MESSAGE();
                                     print(@print_message);
                      end
                      else
                                     print(''No error is generated'');
       end

       --Fetch log path

       if (@log_path ='''' OR @log_path is null )
                      SELECT @log_path=cast(SERVERPROPERTY(''InstanceDefaultLogPath'') as nvarchar);
       if (@log_path ='''' OR @log_path is null )
       begin
                      set @error=@@ERROR
                      if (@error<>0)
                      begin
                                     set @print_message=N''Error ''+ RTRIM(cast(@error as nvarchar(10))) + '' - Message: ''+ ERROR_MESSAGE();
                                     print(@print_message);
                      end
                      else
                                     print(''No error is generated'');
       end



       exec(@complete_command);

       end
       '           

       EXECUTE sp_executesql @Create_SQL_Proc_Statement 
DECLARE@Create\u SQL\u Proc\u语句NVARCHAR(MAX);
选择@Create\u SQL\u Proc\u Statement=N'
创建过程数据库创建脚本
@DBName nvarchar(50),
@数据路径nvarchar(50)='',
@数据文件大小nvarchar(50)=“5000KB”,
@数据文件最大大小nvarchar(50)=“无限制”,
@数据文件增长nvarchar(50)=“1024KB”,
@日志路径nvarchar(50)='',
@日志文件大小nvarchar(50)=“5000KB”,
@日志文件最大大小nvarchar(50)=“1048576KB”,
@日志文件增长nvarchar(50)=“1024KB”
作为
开始
将@l_变量_数据声明为nvarchar(500);
将@l_变量_log声明为nvarchar(500);
声明@complete_命令为nvarchar(1000);
声明@print_消息为nvarchar(1000);
将@error声明为int;
--获取数据路径
如果(@data\u path=''或@data\u path为空)
选择@data\u path=cast(SERVERPROPERTY(“InstanceDefaultDataPath”)作为nvarchar);
如果(@data\u path=''或@data\u path为空)
开始
设置@error=@@error
如果(@error0)
开始
设置@print_message=N“Error”+RTRIM(cast(@Error as nvarchar(10)))+“”-message:“”+Error_message();
打印(@print_message);
结束
其他的
打印(“未生成错误”);
结束
--获取日志路径
如果(@log\u path=''或@log\u path为空)
选择@log_path=cast(SERVERPROPERTY(“InstanceDefaultLogPath”)作为nvarchar);
如果(@log\u path=''或@log\u path为空)
开始
设置@error=@@error
如果(@error0)
开始
设置@print_message=N“Error”+RTRIM(cast(@Error as nvarchar(10)))+“”-message:“”+Error_message();
打印(@print_message);
结束
其他的
打印(“未生成错误”);
结束
exec(@complete_命令);
结束
'           
执行sp_executesql@Create_SQL_Proc_语句

请删除
尝试。。。exception
阻止并给出运行SQL producedure.cursor.execute('exec#db#u create?、?、?、?、?、?、?、?,(db#u名称、数据_路径、数据_文件大小、数据_文件大小、日志#u文件大小、日志#u文件大小)pyodbc.ProgrammingError:('42000',“[42000][Microsoft][SQL Server的ODBC驱动程序13][SQL Server]“,”.(102)(SQLExecDirectW)”)附近的语法不正确请将您的问题添加到请求的澄清中。现在您知道您的SQL定义中有语法错误。要做的第一件事是删除try/except块,以便从数据库中查看错误消息的全文,这有助于缩小范围。我在执行存储过程时遇到问题,因此,我认为这不会有帮助。您是否有权访问SSMS og类似工具您需要确保创建的字符串Create_SQL_Proc_语句对SQL Server有效您的问题来自字符串中需要引号这是我在SSMS中编写的前几行,以确保其有效(需要时,请参阅双引号:Create_SQL_Proc_Statement=N'Create PROCEDURE db_creation_script DBName nvarchar(50),data_path nvarchar(50)='',data_file_size nvarchar(50)=''5000KB',我想知道,为什么您需要一个存储过程来创建数据库?嗨@Peter,是的,这个答案在SSMS中与我的python脚本一起工作,非常感谢。现在,我的python脚本处理默认值时面临一个小问题。我的脚本的编码方式是,在调用此sql过程时,我传入所有参数如下所示:
cursor.execute({call db_creation_script_test(?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,),(A,B,C,D,E,F,G,H,I))
现在只要用户不输入参数,就应该替换默认值,而在我的情况下,只有空格被替换为默认值(“”)这不允许我继续。@alpha123如果我正确理解python脚本,您总是向所有参数传递一个值。尽管它可能是一个空值,但存储过程认为它是您想要的值,而不是默认值。如果您想要默认值,则不能包含参数,或,以及在您的情况下可能更好:在计算传递的参数的存储过程中添加代码,如果传递的值为NULL,则将其设置为默认值。
       DECLARE @Create_SQL_Proc_Statement NVARCHAR(MAX);
       SELECT @Create_SQL_Proc_Statement = N'
       CREATE PROCEDURE db_creation_script
       @DBName nvarchar(50),
       @data_path nvarchar(50) ='''',
       @data_file_size nvarchar(50) = ''5000KB'',
       @data_file_maxsize nvarchar(50) = ''UNLIMITED'',
       @data_file_filegrowth nvarchar(50) = ''1024KB'',
       @log_path nvarchar(50) ='''',
       @log_file_size nvarchar(50) = ''5000KB'',
       @log_file_maxsize nvarchar(50) = ''1048576KB'',
       @log_file_filegrowth nvarchar(50) = ''1024KB''
       AS

       begin

       declare @l_variable_data as nvarchar(500);
       declare @l_variable_log as nvarchar(500);
       declare @complete_command as nvarchar(1000);
       declare @print_message as nvarchar(1000);
       declare @error as int;

       --Fetch data path

       if (@data_path ='''' OR @data_path is null )
                      SELECT @data_path=cast(SERVERPROPERTY(''InstanceDefaultDataPath'') as nvarchar);
       if (@data_path ='''' OR @data_path is null )

       begin
                      set @error=@@ERROR
                      if (@error<>0)
                      begin
                                     set @print_message=N''Error ''+ RTRIM(cast(@error as nvarchar(10))) + '' - Message: ''+ ERROR_MESSAGE();
                                     print(@print_message);
                      end
                      else
                                     print(''No error is generated'');
       end

       --Fetch log path

       if (@log_path ='''' OR @log_path is null )
                      SELECT @log_path=cast(SERVERPROPERTY(''InstanceDefaultLogPath'') as nvarchar);
       if (@log_path ='''' OR @log_path is null )
       begin
                      set @error=@@ERROR
                      if (@error<>0)
                      begin
                                     set @print_message=N''Error ''+ RTRIM(cast(@error as nvarchar(10))) + '' - Message: ''+ ERROR_MESSAGE();
                                     print(@print_message);
                      end
                      else
                                     print(''No error is generated'');
       end



       exec(@complete_command);

       end
       '           

       EXECUTE sp_executesql @Create_SQL_Proc_Statement