如何将参数从databricks传递到SQL Server中的存储过程

问题描述 投票:0回答:1

我在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= 返回带有错误集的结果

pyspark azure-databricks pyodbc
1个回答
0
投票

如何将这些列名作为参数传递给存储过程?

要将列名作为参数传递给存储过程,您可以使用以下代码:

ColA = df.columns[0]
print(ColA)
ColB = df.columns[1]
print(ColB)

它将根据索引获取列名。

enter image description here

存储过程的参数是数据框的列。

如果要将 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 表中的行。

© www.soinside.com 2019 - 2024. All rights reserved.