首页 > 解决方案 > 无法使用 Python 和 SQL Server 执行参数化 SQL

问题描述

我正在尝试运行一个带有许多参数的存储过程。为此,我正在使用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))

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

先感谢您。

标签: pythonsql-serverstored-procedurespyodbc

解决方案


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

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

如果您的代码可以完全控制、、 和的值procName,这不会造成重大的 SQL 注入风险。param1param2param3


推荐阅读