我在SQL Server中有一个存储过程来执行UPSERT操作。
存储过程的参数是数据框的列。
假设我有 3 列;数据帧 upsert_df 中的 ColA、ColB、ColC
如何将这些列名作为参数传递给存储过程?
我正在使用 pyodbc 从 Azure Databricks 执行存储过程。
import pyodbc
connect_string = "DRIVER={ODBC Driver 17 for SQL Server};"
connect_string += f"SERVER={jdbchostname},"
connect_string += f"{jdbcport};"
connect_string += f"DATABASE={db};"
connect_string += f"UID={username};"
connect_string += f"PWD={pwd}"
conn = pyodbc.connect(connect_string)
cursor = conn.cursor()
ColA = upsert_df['ColA']
ColB = upsert_df['ColB']
ColC = upsert_df['ColC']
proc_call = f'EXEC Proc_Name @ColA=?, @ColB=?, @ColC=?'
try:
cursor.execute(proc_call, (ColA, ColB, ColC))
conn.commit()
except Exception as e:
print('Error=', e)
此代码抛出以下异常。我是否正确传递了参数或者代码是否存在其他问题?
Error=
如何将这些列名作为参数传递给存储过程?
要将列名作为参数传递给存储过程,您可以使用以下代码:
ColA = df.columns[0]
print(ColA)
ColB = df.columns[1]
print(ColB)
它将根据索引获取列名。
存储过程的参数是数据框的列。
如果要将 Dataframe 的数据更新到 SQL 表,则需要迭代 Dataframe 的每一行并将这些值传递给存储过程。
示例代码:
import pyodbc
connect_string = "DRIVER={ODBC Driver 17 for SQL Server};"
connect_string += f"SERVER={jdbchostname},"
connect_string += f"{jdbcport};"
connect_string += f"DATABASE={db};"
connect_string += f"UID={username};"
connect_string += f"PWD={pwd}"
conn = pyodbc.connect(connect_string)
cursor = conn.cursor()
for row in df.rdd.toLocalIterator():
ColA = row.Id
ColB = row.Name
proc_call = f'EXEC UpdatePerson @id=?, @name=?'
try:
cursor.execute(proc_call, (ColA, ColB))
conn.commit()
except Exception as e:
print('Error=', e)
它将迭代每一行并更新 SQL 表中的行。