我一直试图用参数调用这个存储过程,但没有成功。我想我已经弄清楚了参数部分,但现在我想我只是把存储过程调用错了。我试图用它们的错误信息(如下(尽可能地记录我的不同方法。如何使用参数调用存储过程并写入数据帧?
尝试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))
最直接的方法赢得了胜利。根本没有必要使这件事复杂化。如果你有一个字典,但无法获得这种格式的参数,那么我想你必须找到字典的解决方案。但对于这个问题,我是不必要地创建字典的人。我只是换了一种更简单的方式来定义我的情妇和中提琴。
我希望这能帮助到别人,因为我花了好几天时间和几个代码板才最终放弃以前的方法,找到了这个获胜的方法!