Databricks中pyodbc调用sp_executesql无数据插入问题求助
解决Databricks中通过pyodbc插入数据无效果的问题
原代码问题分析
你当前用sp_executesql的写法可能存在字符串拼接转义问题,导致实际执行的SQL不符合预期;另外如果连接未开启自动提交,未手动提交事务也会导致数据不落地。
替代方案(Databricks环境下更可靠的实现方式)
方案1:直接执行静态SQL(跳过动态执行)
既然你的INSERT语句不需要动态参数,没必要嵌套sp_executesql,直接传递SQL语句即可:
V_SQL = 'INSERT INTO dbo.ACTUAL_TABLE(NAME,GENDER) SELECT ZNAME,GENDER from dbo.TEST_TABLE' mssql_db.sql(V_SQL) # 若连接未开启自动提交,需手动提交 mssql_db.commit()
方案2:用Databricks Spark SQL原生操作(推荐)
作为Databricks环境的原生能力,Spark DataFrame/Spark SQL稳定性更高,还能利用分布式处理优势:
- 读取源表数据:
test_df = spark.read.format("jdbc") \ .option("url", "你的MSSQL连接URL") \ .option("dbtable", "dbo.TEST_TABLE") \ .option("user", "数据库用户名") \ .option("password", "数据库密码") \ .load()
- 转换并写入目标表(已存在则用
append模式追加):
test_df.select("ZNAME", "GENDER") \ .withColumnRenamed("ZNAME", "NAME") \ .write.format("jdbc") \ .option("url", "你的MSSQL连接URL") \ .option("dbtable", "dbo.ACTUAL_TABLE") \ .option("user", "数据库用户名") \ .option("password", "数据库密码") \ .mode("append") \ .save()
方案3:修复动态SQL的参数化写法
如果确实需要动态执行SQL,避免直接字符串拼接,改用参数化传递:
V_SQL = 'INSERT INTO dbo.ACTUAL_TABLE(NAME,GENDER) SELECT ZNAME,GENDER from dbo.TEST_TABLE' cursor = mssql_db.cursor() # 用占位符传递SQL语句,避免转义问题 cursor.execute("EXECUTE sp_executesql ?", (V_SQL,)) # 手动提交事务 mssql_db.commit()
内容的提问来源于stack exchange,提问作者pythonCoder
相关产品推荐
相关产品推荐

