【问题标题】:Unable to execute parameterized SQL using Python and SQL Server无法使用 Python 和 SQL Server 执行参数化 SQL
【发布时间】:2020-12-02 20:29:08
【问题描述】:

我正在尝试运行一个带有许多参数的存储过程。为此,我使用了pyodbc 库及其cursor.execute 函数。

以下是我要执行的查询:

executionStr = "EXEC ? @ImportJSON= ?, ?=?, ?=?, ?=?",procName, data, param1, param1Value, param2, param2Value, param3, param3Value

当我运行查询时,它给了我一个错误

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

当我尝试按照以下方式运行查询时,它成功执行,我可以看到数据进入。

executionStr = "EXEC "+procName+" @ImportJSON='"+data+"', "+param1+"='"+param1Value+"' , "+param2+"='"+param2Value+"' , "+param3+"='"+param3Value+"';"

我正在尝试以以前的格式运行查询,以便保护我的代码免受 SQL 注入。

我也尝试使用以下参数运行查询,但给出了相同的错误:

preexe = "EXEC ? @ImportJSON= ?, "+param1+"=?, "+param2+"=?, "+param3+"=?"
procedure_cursor.execute(preexe,(procName, data, param1Value, param2Value, param3Value))

我不确定我做错了什么或哪里出错了。任何帮助将不胜感激。

提前谢谢你。

【问题讨论】:

    标签: python sql-server stored-procedures pyodbc


    【解决方案1】:

    您的最后一次尝试是正确的,但参数只能用于传递数据(例如,字符串、数字、日期等),而不是数据库对象名称(例如,表名、列名、存储过程名等)。因此,您需要执行以下操作:

    preexe = f"EXEC {procName} @ImportJSON= ?, {param1}=?, {param2}=?, {param3}=?"
    procedure_cursor.execute(preexe, (data, param1Value, param2Value, param3Value))
    

    只要您的代码可以完全控制procNameparam1param2param3 的值,这不会造成重大的 SQL 注入风险。

    【讨论】:

    • 谢谢戈德。有效!感谢您让我知道数据值和对象名称之间的区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2016-11-02
    • 2018-07-10
    相关资源
    最近更新 更多