问题描述
我有一个 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 (将#修改为@)