Python导入CSV至MS SQL Server报错"Previous SQL was not a query"求助
嘿,刚接触编程就敢折腾CSV上传到SQL Server,已经超棒啦!你遇到的这个错误我之前帮好几个新手排查过,大概率是代码里执行SQL的方式不对,或者对非查询语句的处理逻辑有误,给你几个实用的排查方向:
1. 检查执行SQL的方法是否匹配
如果你用的是Java/JDBC这类工具,一定要注意:写入数据的语句(比如INSERT、BULK INSERT)不能用查询类方法执行!
比如你要是写了stmt.executeQuery("BULK INSERT ...")就会报错,因为executeQuery()是专门用来执行SELECT这类需要返回结果集的查询语句的。正确的做法是用executeUpdate():
// 错误示例:用查询方法执行写入操作 ResultSet rs = stmt.executeQuery("BULK INSERT YourTable FROM 'C:\\data.csv' ..."); // 正确示例:用更新方法处理数据写入 int rowsAffected = stmt.executeUpdate("BULK INSERT YourTable FROM 'C:\\data.csv' ...");
2. 先手动验证SQL语句的正确性
有时候错误不是代码的锅,是SQL本身有问题。你可以先打开SQL Server Management Studio(SSMS),把你要执行的上传SQL语句直接跑一遍,看看能不能正常导入数据:
- 注意CSV的路径要是绝对路径,而且SQL Server的服务账户得有这个文件的读取权限
- 如果CSV有表头,记得在BULK INSERT里加
FIRSTROW = 2跳过第一行,比如:
BULK INSERT YourTableName FROM 'C:\your\file\path\data.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', FIRSTROW = 2 );
如果SSMS里跑都报错,那先把SQL的问题解决,再回到代码里调试。
3. 去掉不必要的结果集处理逻辑
有些新手会习惯性地在执行完写入操作后,还去调用getResultSet()或者rs.next()这类获取结果集的代码,但非查询语句根本不会返回结果集,这样就会触发"Previous SQL was not a query"的错误。比如下面这段代码就要删掉结果集相关的部分:
// 错误:执行完INSERT后强行获取结果集 stmt.executeUpdate("INSERT INTO YourTable VALUES (...)"); ResultSet rs = stmt.getResultSet(); // 这里会直接报错!
4. 排查是否有连续执行SQL的逻辑问题
如果你的代码里连续执行了多个SQL语句,比如先执行一个非查询语句,接着又用同一个Statement对象执行查询,也可能出现这个错误。这种情况下,最好每个SQL语句用单独的Statement,或者在执行下一个语句前确保上一个语句的资源已经清理干净。
要是按照上面的方法还是没解决,你可以把核心的代码片段贴出来,我帮你精准定位问题~
内容的提问来源于stack exchange,提问作者Fahim

