You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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稳定性更高,还能利用分布式处理优势:

  1. 读取源表数据:
test_df = spark.read.format("jdbc") \
    .option("url", "你的MSSQL连接URL") \
    .option("dbtable", "dbo.TEST_TABLE") \
    .option("user", "数据库用户名") \
    .option("password", "数据库密码") \
    .load()
  1. 转换并写入目标表(已存在则用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:52:11