Sql server 使用SQL过程在MSSQL中创建数据库
嗨,我正在尝试使用下面的SQL过程创建一个数据库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
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