【问题标题】:pyodbc procedure execute failurepyodbc 过程执行失败
【发布时间】:2020-07-15 08:50:43
【问题描述】:

我在 SQL Server (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 会返回正确的行。

但是如果我调用这个 proc 会有一个错误。

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 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, ,

【问题讨论】:

  • 错误是什么?
  • 错误很明显。定义了 5 个参数,但只传递了一个内容非常奇怪的文本参数。 SQL 参数不是格式说明符。他们只是替换标记。如果他们这样做了,他们将无法防止 SQL 注入,或避免格式错误。您需要传递各个参数值​​
  • 如何获取参数名称?我现在唯一的就是这个项目中的过程名称。

标签: python sql-server stored-procedures ssms pyodbc


【解决方案1】:

所以最后我有一个解决方案。

这是我的解决方案: 我已经删除了 MSSQL 中的代码部分 variables,这是不支持的。 我将带有variables 的列表直接交给了执行语句。

像这样:

return stmt.execute(sql, call[1]).commit()

谢谢@Panagiotis Kanavos

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多