【问题标题】:Pyodbc bulk insert statement won't parameterisePyodbc 批量插入语句不会参数化
【发布时间】:2023-03-27 01:20:01
【问题描述】:

我试图让 Python 通过清理 csv 文件来填充 SQL 表,然后在 SQL 中进行批量上传。当我尝试按以下方式执行插入时:

sqlCommand = "BULK INSERT ? FROM ? WITH ( BATCHSIZE = 1000, ROWTERMINATOR = '\\n', KEEPNULL )"
cursor.execute(sqlCommand,tableName,fileName)

我收到以下错误:“@P1”附近的语法不正确。 (102) (SQLExecDirectW);

但是,如果我这样做:

"BULK INSERT {0} FROM {1} WITH ( BATCHSIZE = 1000, ROWTERMINATOR = '\\n', KEEPNULLS )".format(tableName,fileName)
cursor.execute(sqlCommand)

效果很好。

有没有更好的方法让它工作?

【问题讨论】:

  • 谢谢,我没有意识到你不能参数化表名。

标签: python sql pyodbc


【解决方案1】:

对于 T-SQL 中的表名(和列)名,不允许使用 ? parameter 占位符。

第二个选项是在 Python 中使用字符串格式在对数据库服务器执行之前构建 T-SQL 语句。这也称为dynamic SQL,是使用BULK INSERT 完成任务的唯一方法。

动态 SQL(以及一般未经验证的输入)引入了 SQL injection 漏洞,因此如果这是面向用户的脚本,请确保您正在验证 tableNamefileName 变量。

【讨论】:

    猜你喜欢
    • 2012-09-06
    • 2011-06-07
    • 1970-01-01
    • 2014-09-07
    • 2016-08-28
    • 2012-02-26
    • 2013-04-04
    • 2016-10-18
    • 1970-01-01
    相关资源
    最近更新 更多