无法使用 Python 和 SQL 服务器执行参数化 SQL
Unable to execute parameterized SQL using Python and SQL Server
我正在尝试 运行 一个带有大量参数的存储过程。为此,我正在使用 pyodbc
库及其 cursor.execute
函数。
以下是我要执行的查询:
executionStr = "EXEC ? @ImportJSON= ?, ?=?, ?=?, ?=?",procName, data, param1, param1Value, param2, param2Value, param3, param3Value
当我 运行 查询时,它给我一个错误
TypeError: The first argument to execute must be a string or unicode
query.
当我尝试 运行 下面的查询成功执行时,我可以看到数据进入。
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))
我不确定自己做错了什么或哪里出错了。任何帮助将不胜感激。
提前致谢。
您上次的尝试是正确的,但参数只能用于传递数据值(例如,字符串、数字、日期等),而不是数据库对象名称(例如,table 名称、列名称、存储过程名称 等)。因此,您需要执行以下操作:
preexe = f"EXEC {procName} @ImportJSON= ?, {param1}=?, {param2}=?, {param3}=?"
procedure_cursor.execute(preexe, (data, param1Value, param2Value, param3Value))
如果您的代码可以完全控制 procName
、param1
、param2
和 param3
.
我正在尝试 运行 一个带有大量参数的存储过程。为此,我正在使用 pyodbc
库及其 cursor.execute
函数。
以下是我要执行的查询:
executionStr = "EXEC ? @ImportJSON= ?, ?=?, ?=?, ?=?",procName, data, param1, param1Value, param2, param2Value, param3, param3Value
当我 运行 查询时,它给我一个错误
TypeError: The first argument to execute must be a string or unicode query.
当我尝试 运行 下面的查询成功执行时,我可以看到数据进入。
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))
我不确定自己做错了什么或哪里出错了。任何帮助将不胜感激。
提前致谢。
您上次的尝试是正确的,但参数只能用于传递数据值(例如,字符串、数字、日期等),而不是数据库对象名称(例如,table 名称、列名称、存储过程名称 等)。因此,您需要执行以下操作:
preexe = f"EXEC {procName} @ImportJSON= ?, {param1}=?, {param2}=?, {param3}=?"
procedure_cursor.execute(preexe, (data, param1Value, param2Value, param3Value))
如果您的代码可以完全控制 procName
、param1
、param2
和 param3
.