操作数类型与参数化更新查询冲突



我有一个包含以下列的SQL Server表(*表示允许空值):

  • 身份证(整数)
  • 申请 ID (整数)
  • 申请人身份证(整数)
  • WorkflowStateID (int)
  • 工作流日期(日期时间)
  • 提交日期(日期时间)
  • 开始日期(日期)*
  • 处置 ID (整数)*
  • ATSApplicationID (varchar(255))*
  • 应用链接 (varchar(255))*
  • 创建日期(日期时间)
  • 修改日期(日期时间)

我正在尝试使用pypyodbc和Driver=SQL Server(MS SQL Server 2012数据库)进行参数化的INSERT查询。下面是查询:

sql_statement = """
UPDATE [hr].[ATS.Applications] SET RequisitionID = ?, WorkflowStateID = ?, WorkflowDate = ?, StartDate = ?, DispositionID = ?, ModifyDate = ? WHERE ID = ?
"""
cursor.execute(sql_statement,(new_application.requisition_id,
new_application.workflow_state,
new_application.workflow_date.strftime("%Y-%m-%dT%H:%M:%S"),
new_start_date,
new_application.disposition,
now,
old_application.ID))
cursor.commit()

导致以下错误:

DataError: (u'22018', u'[22018] [Microsoft][ODBC SQL Server Driver][SQL Server]Operand type clash: int is incompatible with date')

我假设其中一个日期字符串被解释为计算整数,但是使用调试器,所有数据和数据类型似乎都与我的表兼容:

new_application.requisition_id = {int} 7
new_application.workflow_state = {int} 19
new_application.workflow_date.strftime("%Y-%m-%dT%H:%M:%S") = {str} '2017-05-09T07:52:13'
new_start_date = {NoneType} None
new_application.disposition = {int} 7
now = {str} '2017-05-09T17:55:27'
old_application.ID = {int} 34402

我尝试将日期时间值作为日期时间对象和字符串插入,并且 似乎无法解析它期望的数据类型。

知道为什么我对此更新声明有问题吗?

pypyodbc处理从 Python 日期/日期时间对象到相应 SQL Server 数据类型的类型转换,而不是依赖于字符串格式。

在下面的示例中,我假设:

  • new_application.workflow_date是 Python 日期时间对象
  • 原始问题的now旨在使用日期时间模块获取当前系统时间
sql_statement = """
UPDATE [hr].[ATS.Applications] SET RequisitionID = ?, WorkflowStateID = ?, WorkflowDate = ?, StartDate = ?, DispositionID = ?, ModifyDate = ? WHERE ID = ?
"""
cursor.execute(sql_statement,(new_application.requisition_id,
new_application.workflow_state,
new_application.workflow_date,
new_start_date,
new_application.disposition,
datetime.now(),
old_application.ID))
cursor.commit()

有关包括 SQL ServerDATETIME类型的支持示例,请参阅此处的答案。

最新更新