Pyodbc 批量插入语句无法参数化

2 投票
1 回答
1454 浏览
提问于 2025-04-18 09:34

我正在尝试用Python来处理CSV文件,然后把清理好的数据放到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)

就能完美运行。

有没有更好的方法让这个工作正常呢?

1 个回答

1

在T-SQL中,不能使用?这种参数占位符来表示表名和列名。

第二种选择是使用Python中的字符串格式化,在执行之前先构建好T-SQL语句。这种方法也叫做动态SQL,而且这是使用BULK INSERT完成你任务的唯一方法。

动态SQL(以及一般来说未经验证的输入)会带来SQL注入的安全风险,所以如果这个脚本是给用户使用的,一定要确保对tableNamefileName这两个变量进行验证。

撰写回答