Pyodbc使用参数调用存储过程



我一直试图用参数调用这个存储过程,但没有成功。我想我已经弄清楚了参数部分,但现在我想我只是把存储过程调用错了。我试图用它们的错误信息(如下(尽可能地记录我的不同方法。如何使用参数调用存储过程并写入数据帧?

尝试A:在字典中使用带params的占位符联接,并为变量使用%s

params1 = {'mo1_start_date' : '12/30/2019', 'mo1_end_date' : '01/26/2020'}
placeholders = ','.join('?' for i in range(len(params1.values())))  # '?,?'
interconnectmo1 = """exec TNT.dbo.abc 
@start_date = %(mo1_start_date)s  -- datetime 
, @end_date = %(mo1_end_date)s    -- datetime 
, @syscode = NULL           -- varchar(8000)  
, @estimate_ids = NULL       -- varchar(8000)""" %placeholders
sqlmo1 = pd.read_sql(interconnectmo1, conn, params1)

错误A:类型错误:格式需要映射

试试B:字典中没有带params的占位符联接,还有?对于可变

params1 = {'mo1_start_date' : '12/30/2019', 'mo1_end_date' : '01/26/2020'}
interconnectmo1 = """exec TNT.dbo.abc
@start_date = ? -- datetime 
, @end_date = ?    -- datetime 
, @syscode = NULL           -- varchar(8000)  
, @estimate_ids = NULL       -- varchar(8000)""" 
sqlmo1 = pd.read_sql(interconnectmo1, conn, params1)

错误B:[ODBC SQL Server驱动程序]COUNT字段不正确或语法错误(0((SQLExecDirectW(

尝试C:使用占位符联接,其中params在列表中,%s用于变量

params1 = {'mo1_start_date' : '12/30/2019', 'mo1_end_date' : '01/26/2020'}
paramsmo1=list(params1.values())
placeholders = ','.join('?' for i in range(len(paramsmo1)))  # '?,?'
interconnectmo1 = """exec TNT.dbo.abc
@start_date = %(mo1_start_date)s -- datetime 
, @end_date = %(mo1_end_date)s    -- datetime 
, @syscode = NULL           -- varchar(8000)  
, @estimate_ids = NULL       -- varchar(8000)""" %placeholders
sqlmo1 = pd.read_sql(interconnectmo1, conn, paramsmo1)

错误C:类型错误:格式需要映射

尝试D:字典中没有带params的占位符联接,变量为%s

params1 = {'mo1_start_date' : '12/30/2019', 'mo1_end_date' : '01/26/2020'}
interconnectmo1 = """exec TNT.dbo.abc
@start_date = "%(mo1_start_date)s" -- datetime 
, @end_date =  "%(mo1_end_date)s"   -- datetime 
, @syscode = NULL           -- varchar(8000)  
, @estimate_ids = NULL       -- varchar(8000)""" % (params1)
sqlmo1 = pd.read_sql(interconnectmo1, conn, params1)

错误D:过程或函数需要参数"@end_date",但未提供该参数。

Try E:正在使用游标进行尝试。。

params1 = {'mo1_start_date' : '12/30/2019', 'mo1_end_date' : '01/26/2020'}
csr = conn.cursor()
interconnectmo1 = csr.execute("""exec TNT.dbo.abc 
@start_date = "%(mo1_start_date)s" -- datetime 
, @end_date =  "%(mo1_end_date)s"   -- datetime 
, @syscode = NULL           -- varchar(8000)  
, @estimate_ids = NULL       -- varchar(8000)""" % (params1))
csr.execute(interconnectmo1, (params1))

错误E:过程或函数需要参数"@end_date",但未提供该参数。

我终于开始工作了。此代码有两个问题。

  • 数据类型注释调用。CCD_ 1和CCD_。即使当我的代码识别出第一个参数时,由于这种中断,它也找不到第二个参数
  • 作为参数的字典输入就是不起作用。我不确定这是否不是一种功能,或者我只是从来没有得到正确的语法来让它工作,但它没有工作。我也考虑过绑定参数-没有雪茄。我甚至尝试了列表输入,但没有成功
mo1_start_date='12/30/2019' 
mo1_end_date='1/26/2020' 
interconnectmo1 = """exec TNT.dbo.abc
@start_date = ? , @end_date =  ? , @syscode = NULL , @estimate_ids = NULL""" 
sqlmo1 = pd.read_sql_query(interconnectmo1, conn, params=(mo1_start_date, mo1_end_date))

最直接的方法赢得了胜利。根本没有必要使这件事复杂化。如果你有一个字典,但无法获得这种格式的参数,那么我想你必须找到字典的解决方案。但对于这个问题,我是不必要地创建字典的人。我只是换了一种更简单的方式来定义我的情妇和中提琴。

我希望这能帮助到别人,因为我花了好几天时间和几个代码板才最终放弃以前的方法,找到了这个获胜的方法!

最新更新