Python 到存储过程 - 要执行的第一个参数必须是字符串或 unicode 查询



我有一个存储过程,其中包含 50 多个参数,在 SQL Server 上插入表中(基本上是通过存储过程插入数据帧(。 当我运行代码时,出现以下错误:

要执行的第一个参数必须是字符串或 unicode 查询。

我尝试了以下语法,但总是相同的错误:

cursor = engine.raw_connection().cursor()
#1
df.apply(lambda row: cursor.execute('EXEC MyProcedure(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)',row.values), axis=1)
#2
df.apply(lambda row: cursor.execute('EXEC MyProcedure?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?',row.values), axis=1)
#3
df.apply(lambda row: cursor.execute("""EXEC MyProcedure(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)""",row.values), axis=1)
results = list(cursor.fetchall())
#4
df.apply(lambda row: cursor.execute(text('EXEC MyProcedure(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)',row.values)), axis=1)
#5
df.apply(lambda row: cursor.execute('EXEC MyProcedure',row.values), axis=1)
cursor.close()

这里不支持cursor.callproc(),所以我必须通过EXECCALL请求。
所以我相信它来自我的参数处理,但我不知道如何处理它。由于我有 57 个参数,我试图避免尽可能多地命名所有参数......我
的第一个愿望是通过传递过程名称作为我的 python 函数的参数来使代码运行任何过程,但由于它无法运行,我选择了假设更容易的东西。 该过程已通过 SQL Server 管理直接在数据库上执行,并且工作正常。

你可以通过使用pyodbc的Cursor#executemany方法简化事情:

cnxn = engine.raw_connection()
cnxn.autocommit = True
crsr = cnxn.cursor()
# prepare test environment
crsr.execute("TRUNCATE TABLE MyTable")  # clear previous test data, if any
# prepare test data
df = pd.DataFrame([(1, 'Alfa'), (2, 'Bravo')], columns=['id', 'txt'])
sql = "{CALL MyProcedure (?, ?)}"
rows = df.itertuples(index=False)
crsr.executemany(sql, rows)
# verify results
results = crsr.execute("SELECT * FROM MyTable").fetchall()
print(results)
# [(1, 'Alfa'), (2, 'Bravo')]

最新更新