pyodbc 过程执行失败
pyodbc procedure execute failure
我在 SQL 服务器 (SSMS Studio)
上有一个存储过程
这是过程:
CREATE PROCEDURE [dbo].[SELECT_main_program] (
@name varchar(255))
AS
BEGIN
SELECT ed_programms.showing_name, ed_programms.scripts, ed_programms.styles, ed_programms.infos, ed_menu.*
FROM ed_programms
JOIN ed_menu
ON ed_menu.id_program = ed_programms.id AND ed_menu.hidden = 0
WHERE ed_programms.name = @name AND ed_programms.active = 1;
END
因此,如果我将此过程称为 pyodbc returns 右行。
但是如果我调用这个过程就会出错。
CREATE PROCEDURE [dbo].[INSERT_ed_menu_program] (
@name varchar(255),
@showing_name varchar(255),
@infos varchar(255),
@scripts varchar(500),
@styles varchar(500))
AS
BEGIN
INSERT INTO ed_programms
(name, showing_name, infos, scripts, styles, active)
VALUES(@name, @showing_name, @infos, @scripts, @styles, 1)
END
这是我的 python 代码。
# Create the procedure params.
params = ", ".join(['?' for i, row in enumerate(list(call[1]))])
variables = ", ".join([row for i, row in enumerate(list(call[1]))])
sql = "EXEC {sp} {prms}".format(sp=call[0], prms=params)
# Check if is an INSERT, UPDATE or DELETE.
if call[0][0].upper() == "I" or call[0][0].upper() == "U" or call[0][0].upper() == "D":
return stmt.execute(sql, [variables]).commit()
else:
return stmt.execute(sql, [variables]).fetchall()
变量call
是一个列表,包含过程的名称和参数。
所以问题是如果我执行 select 过程,为什么我的代码可以工作。但是如果我执行 insert proc 不工作?
错误是
INSERT_ed_menu_program The SQL contains 5 parameter markers but 1 parameters were supplied HY000
更新 2:打印的 SQL 是
sql = EXEC INSERT_ed_menu_program ?, ?, ?, ?, ?
variables = my_program, Mein Test 01, test 01 desc, ,
所以我终于有了一个解决方案。
这是我的解决方案:
我已经删除了 MSSQL 中的代码部分 variables
,这是不支持的。
我直接将带有 variables
的列表交给执行语句。
像这样:
return stmt.execute(sql, call[1]).commit()
我在 SQL 服务器 (SSMS Studio)
上有一个存储过程这是过程:
CREATE PROCEDURE [dbo].[SELECT_main_program] (
@name varchar(255))
AS
BEGIN
SELECT ed_programms.showing_name, ed_programms.scripts, ed_programms.styles, ed_programms.infos, ed_menu.*
FROM ed_programms
JOIN ed_menu
ON ed_menu.id_program = ed_programms.id AND ed_menu.hidden = 0
WHERE ed_programms.name = @name AND ed_programms.active = 1;
END
因此,如果我将此过程称为 pyodbc returns 右行。
但是如果我调用这个过程就会出错。
CREATE PROCEDURE [dbo].[INSERT_ed_menu_program] (
@name varchar(255),
@showing_name varchar(255),
@infos varchar(255),
@scripts varchar(500),
@styles varchar(500))
AS
BEGIN
INSERT INTO ed_programms
(name, showing_name, infos, scripts, styles, active)
VALUES(@name, @showing_name, @infos, @scripts, @styles, 1)
END
这是我的 python 代码。
# Create the procedure params.
params = ", ".join(['?' for i, row in enumerate(list(call[1]))])
variables = ", ".join([row for i, row in enumerate(list(call[1]))])
sql = "EXEC {sp} {prms}".format(sp=call[0], prms=params)
# Check if is an INSERT, UPDATE or DELETE.
if call[0][0].upper() == "I" or call[0][0].upper() == "U" or call[0][0].upper() == "D":
return stmt.execute(sql, [variables]).commit()
else:
return stmt.execute(sql, [variables]).fetchall()
变量call
是一个列表,包含过程的名称和参数。
所以问题是如果我执行 select 过程,为什么我的代码可以工作。但是如果我执行 insert proc 不工作?
错误是
INSERT_ed_menu_program The SQL contains 5 parameter markers but 1 parameters were supplied HY000
更新 2:打印的 SQL 是
sql = EXEC INSERT_ed_menu_program ?, ?, ?, ?, ?
variables = my_program, Mein Test 01, test 01 desc, ,
所以我终于有了一个解决方案。
这是我的解决方案:
我已经删除了 MSSQL 中的代码部分 variables
,这是不支持的。
我直接将带有 variables
的列表交给执行语句。
像这样:
return stmt.execute(sql, call[1]).commit()