通过pyodbc在SQL查询中指定列条件会导致错误

时间:2019-05-06 14:52:37

标签: python sql-server pyodbc

我正在通过pyodbc对MS SQL Server进行查询:

    conn = pyodbc.connect('DRIVER={ODBC Driver 11 for SQL Server};SERVER=some_server, some_port;DATABASE=MAP;UID='xxx';PWD='xxx')
    cursor = conn.cursor()

    query = """SELECT v_MAMain.MAID, v_MAMain.startDate, v_MAMain.endDate, v_MAMain.fromTime, v_MAMain.toTime, v_MAMain.StatusDesc, v_MAMain.name, v_Event_Statistic.TotalGuestsAtEvent, v_Event_Statistic.PlannedGuestsAtEvent, v_Event_Statistic.City, v_Event_Statistic.Location, v_Event_Statistic.Host, v_Event_Statistic.EventSpeakers, v_MAMain.Owner, v_Event_Statistic.PlannedHoursProjectOwner, v_Event_Statistic.EventManagerName, v_Event_Statistic.PlannedHoursEventManager, v_Event_Statistic.CreditSuisseEventManager, v_MAMain.CostCenter, v_MAMain.[Project Year], v_MAMain.category, MADetails.NameOfEventStaff1, MADetails.PlannedWorkDurationEventStaff1, MADetails.NameOfEventStaff2, MADetails.PlannedWorkDurationEventStaff2, MADetails.NameOfEventStaff3, MADetails.PlannedWorkDurationEventStaff3, MADetails.NameOfEventStaff4, MADetails.PlannedWorkDurationEventStaff4, MADetails.NameOfEventStaff5, MADetails.PlannedWorkDurationEventStaff5, v_Event_Statistic.KPIEventQuality, v_Event_Statistic.KPIBusinessFit
FROM (v_MAMain INNER JOIN v_Event_Statistic ON v_MAMain.MAID = v_Event_Statistic.ProjectID) INNER JOIN MADetails ON v_MAMain.MAID = MADetails.MAID
WHERE (((v_MAMain.StatusDesc)<>"Deleted") AND ((v_MAMain.CostCenter)="0892 / 932" Or (v_MAMain.CostCenter)="0897 / 951") AND ((v_MAMain.[Project Year])=2019) AND ((v_MAMain.category)="Event"));"""

    cursor.execute(query)

我收到以下错误:

  

pyodbc.ProgrammingError :(“ 42S22”,“ [42S22] [Microsoft] [ODBC驱动程序   11对于SQL Server] [SQL Server]无效的列名“已删除”。 (207)   (SQLExecDirectW); [42S22] [Microsoft] [用于SQL的ODBC驱动程序11   服务器] [SQL Server]无效的列名'0892/932'。 (207); [42S22]   [Microsoft] [用于SQL Server的ODBC驱动程序11] [SQL Server]无效列   名称为“ 0897/951”。 (207); [42S22] [Microsoft] [用于SQL的ODBC驱动程序11   服务器] [SQL Server]无效的列名“事件”。 (207)“)

似乎已将列标准DeletedEvent等作为列名读取。没有WHERE子句的相同查询可以正常工作。

该查询是在Access中设计的,并且自动生成的SQL已从Access复制粘贴到我的脚本中。

我需要以某种方式更正SQL还是导致错误的其他原因?

1 个答案:

答案 0 :(得分:1)

将双引号更改为围绕常数值的单引号。在SQL Server中,双引号中的字符串被视为列名。