无法在一次执行中从 python 执行 SQL 命令序列

问题描述

我有一个 sql Server 数据库的初始化脚本,它经过、删除一堆东西,然后重新创建架构、表、存储过程,最终更多。脚本现在有 2500 多行,最后可能至少是原来的两倍。

我对此并不满意。我想将其分解,以便我可以拥有执行特定部分的单独代码,因此我可以 1) 从 Python 调用这些代码段,以及 2) 将各个 sql 段检入 GIT。我希望在一个文件中单独拥有一个给定的存储过程,而不是最终可能是 8K 或 10K 行的怪物,这是有道理的。

所以我的第一个刺是说有一个 sql 文件clean_database.sql(比这个更大的真实文件

use [$db_name]
go
declare @schemaName varchar(500)
declare @objName varchar(500)

-- if the cursor exists,get rid of it
IF CURSOR_STATUS('global','cur')>=-1
BEGIN
 DEALLOCATE cur
END

-- Get a clean cursor of the stored procedure objects,along with the associated schema
declare cur cursor
    for select s.Name,p.Name from sys.objects p
    INNER JOIN sys.schemas s ON p.schema_id = s.schema_id
    WHERE p.type = 'V' and is_ms_shipped = 0 and p.name not like 'sp[_]%diagram%'
    ORDER BY s.Name,p.Name
open cur

-- go through the list generated in the last step and delete each object in turn
fetch next from cur into @schemaName,@objName
while @@fetch_status = 0`enter code here`
begin
    exec('drop view ' + @schemaName + '.' + @objName)
    -- print 'drop view ' + @schemaName + '.' + @objName
    fetch next from cur into @schemaName,@objName
end
close cur
deallocate cur
go

然后我像这样用 Python 调用它。

    filename = r"sql\clean_database.sql"
    with open(filename,mode='r') as f:
        raw_script = f.read()
    init_script = raw_script.replace("$db_name",config["db_name"])
    cursor.execute(init_script)

但这会产生一个错误 - 我认为一长串的东西不会有帮助,表明我错误地使用了这个语句。 (无论如何我会在最后包含它。)

通常,当我调用 cursor.execute() 时,我会在数据库中已经存在的存储过程上执行此操作,但理想情况下,这些脚本将在没有任何内容数据库上执行(或者可能是一些以前需要的测试内容)重新初始化)。简单地排除“删除所有内容”部分不会解决任何问题,因为我有一些很长的 CREATE TABLE 语句(至少一个包含 200 多个字段)。

我考虑过逐行阅读,但这在直觉上似乎是错误的。例如,在 create table 命令中执行一行有什么意义 - 该行不是要执行的完整语句。

我不确定这是否可以直接从 Python 中实现。我目前正在查看 sqlcmd 实用程序,但并不明显这是正确的方法。在我看来,我想做的事情是显而易见的和普遍的。有没有规范的方法

pyodbc.ProgrammingError: ('42000',"[42000] [Microsoft][ODBC Driver 17 for sql Server][sql Server]'go' 附近的语法不正确。(102) (sqlExecDirectW); [42000] [Microsoft ][ODBC Driver 17 for sql Server][sql Server]'cur' 附近的语法不正确。(102); [42000] [Microsoft][ODBC Driver 17 for sql Server][sql Server]变量名 '@schemaName' 有已经声明。变量名在查询批处理或存储过程中必须是唯一的。(134); [42000] [Microsoft][ODBC Driver 17 for sql Server][sql Server]变量名“@objName”已经声明. 查询批处理或存储过程中的变量名称必须是唯一的。(134); [42000] [Microsoft][ODBC Driver 17 for sql Server][sql Server]'cur' 附近的语法不正确。(102); [42000] [Microsoft][ODBC Driver 17 for sql Server][sql Server]变量名“@schemaName”已经声明。变量名在查询批处理或存储过程中必须是唯一的。(134); [42000] [Microsoft] [用于 sql Server 的 ODBC 驱动程序 17][sql服务器]变量名 '@objName' 已被声明。变量名在查询批处理或存储过程中必须是唯一的。 (134); [42000] [Microsoft][用于 sql Server 的 ODBC 驱动程序 17][sql Server]'cur' 附近的语法不正确。 (102); [42000] [Microsoft][用于 sql Server 的 ODBC 驱动程序 17][sql Server]'go' 附近的语法不正确。 (102); [42000] [Microsoft][ODBC Driver 17 for sql Server][sql Server]变量名“@schemaName”已经声明。变量名在查询批处理或存储过程中必须是唯一的。 (134); [42000] [Microsoft][用于 sql Server 的 ODBC 驱动程序 17][sql Server]'cur' 附近的语法不正确。 (102)")

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...