T-SQL 语句在 SQL Server 中有效,但是当我在 Python 中使用它时,它总是出错

我可以通过 Python 连接 SQL Server 数据库并执行基本查询,但是一旦我开始INNER JOIN向查询中添加 s 等,Python 就会出错:

关键字“Order”附近的语法不正确。DB-Lib 错误消息 20018,严重性 15:\n一般 SQL Server 错误: 检查来自 SQL Server 的消息\n

我将把代码放在下面,但我认为一定有一些 Python 格式,我弄错了,因为查询使用其他 SQL 工具工作。

在我的搜索中,我发现在 Python 中使用 T-SQL 时INNER JOIN应该ON缩进该部分。由于我有这么多INNER JOINs,也许我缩进不正确?我还看到,当你在Python中分解SQL时,你必须在每行末尾添加一个\。

任何帮助或链接表示赞赏!

    import pymssql


    conn = pymssql.connect(server= 'xxx',

                           user= 'xxx',

                           password= 'xxx',

                           database= 'xxx'

                           )


    cursor = conn.cursor()


    sql = "SELECT PatientInfo.MRN, AccountPersonalInfo.LastName, Visit.VisitNumber, PatientInfo.FirstName, PatientInfo.LastName, AccountPersonalInfo.FirstName, Report.LastSignDate, Order.ProcedureDescList, Visit.Facility, Order.CompleteDate, Order.FillerOrderNumber \

FROM ((Comm4.dbo.Order Order  INNER JOIN Comm4.dbo.Report Report \

                                  ON Order.ReportID=Report.ReportID) \

      INNER JOIN (Comm4.dbo.PatientInfo PatientInfo INNER JOIN Comm4.dbo.Visit Visit \

                                                        ON PatientInfo.PatientID=Visit.PatientID) \

          ON Order.VisitID=Visit.VisitID) INNER JOIN Comm4.dbo.AccountPersonalInfo AccountPersonalInfo \

                                              ON Report.SignerAcctID=AccountPersonalInfo.AccountID \

WHERE  PatientInfo.MRN<>'TEMPORARY' AND Report.LastSignDate>={ts '2020-09-01 00:00:00'} AND Report.LastSignDate<{ts '2020-10-01 00:00:00'}) \

ORDER BY Report.LastSignDate, PatientInfo.MRN"


     cursor.execute(sql)


     row = cursor.fetchone()


     conn.close()


     print(row) 


梵蒂冈之花
浏览 93回答 2
2回答

鸿蒙传说

因为Order是SQL Server 关键字,所以您需要对标识符进行转义,例如使用方括号:[Order]。否则编译器认为您正在尝试调用该ORDER BY命令。最好使用表别名来避免重复较长的表名:sql = """SELECT pi.mrn                , a.lastname                , v.visitnumber                , pi.firstname                 , pi.lastname                 , a.firstname                 , r.lastsigndate                , o.proceduredesclist                , v.facility                , o.completedate                , o.fillerordernumber          FROM              (               (comm4.dbo.[ORDER] o                INNER JOIN comm4.dbo.report r                      ON o.reportid = r.reportid)              INNER JOIN                (comm4.dbo.patientinfo pi                INNER JOIN comm4.dbo.visit v                       ON pi.patientid = v.patientid)                ON o.visitid = v.visitid             )          INNER JOIN comm4.dbo.accountpersonalinfo a               ON r.signeracctid = a.accountid          WHERE pi.mrn <> 'TEMPORARY'            AND r.lastsigndate >= {ts '2020-09-01 00:00:00'}            AND r.lastsigndate <  {ts '2020-10-01 00:00:00'}         ORDER BY r.lastsigndate                  , pi.mrn     """虽然带括号的嵌套连接是允许的(让人想起 MS Access SQL),但您可以避免这种嵌套,因为所有连接都是INNER. 更扁平的 SQL 语句可以提高可读性和可维护性。sql = """SELECT pi.mrn                , a.lastname                , v.visitnumber                , pi.firstname                 , pi.lastname                 , a.firstname                 , r.lastsigndate                , o.proceduredesclist                , v.facility                , o.completedate                , o.fillerordernumber          FROM comm4.dbo.[ORDER] o         INNER JOIN comm4.dbo.report r               ON o.reportid = r.reportid         INNER JOIN comm4.dbo.visit v                ON o.visitid = v.visitid          INNER JOIN comm4.dbo.patientinfo pi               ON pi.patientid = v.patientid         INNER JOIN comm4.dbo.accountpersonalinfo a               ON r.signeracctid = a.accountid          WHERE pi.mrn <> 'TEMPORARY'            AND r.lastsigndate >= {ts '2020-09-01 00:00:00'}            AND r.lastsigndate <  {ts '2020-10-01 00:00:00'}         ORDER BY r.lastsigndate                  , pi.mrn     """

HUH函数

你的sql语法中有几个错误,执行连接时不需要额外的括号“((”。你不必担心缩进SQL语句,但是python缩进和换行可能有点棘手。为了简化你的代码,你可以在Python中利用多行字符串(即使用""" some string """),例如。import pymssqlconn = pymssql.connect(server= 'xxx',&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user= 'xxx',&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;password= 'xxx',&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;database= 'xxx'&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;)cursor = conn.cursor()sql = """SELECT&nbsp;&nbsp; &nbsp; PatientInfo.MRN,&nbsp;&nbsp; &nbsp; AccountPersonalInfo.LastName,&nbsp;&nbsp; &nbsp; Visit.VisitNumber,&nbsp;&nbsp; &nbsp; PatientInfo.FirstName,&nbsp;&nbsp; &nbsp; PatientInfo.LastName,&nbsp;&nbsp; &nbsp; AccountPersonalInfo.FirstName,&nbsp;&nbsp; &nbsp; Report.LastSignDate,&nbsp;&nbsp; &nbsp; Orders.ProcedureDescList,&nbsp;&nbsp; &nbsp; Visit.Facility,&nbsp;&nbsp; &nbsp; Orders.CompleteDate,&nbsp;&nbsp; &nbsp; Orders.FillerOrderNumber&nbsp;FROM&nbsp;&nbsp; &nbsp; Comm4.dbo.Order Orders&nbsp;&nbsp;INNER JOIN&nbsp;&nbsp; &nbsp; Comm4.dbo.Report Report ON Orders.ReportID=Report.ReportIDINNER JOIN&nbsp;&nbsp; &nbsp; Comm4.dbo.Visit Visit ON Orders.VisitID=Visit.VisitIDINNER JOIN&nbsp;&nbsp; &nbsp; Comm4.dbo.PatientInfo PatientInfo ON PatientInfo.PatientID=Visit.PatientIDINNER JOIN&nbsp;&nbsp; &nbsp; Comm4.dbo.AccountPersonalInfo AccountPersonalInfo ON&nbsp;&nbsp; &nbsp; Report.SignerAcctID=AccountPersonalInfo.AccountID&nbsp;WHERE&nbsp;&nbsp;&nbsp; &nbsp;PatientInfo.MRN<>'TEMPORARY' AND&nbsp;&nbsp; &nbsp;Report.LastSignDate>={ts '2020-09-01 00:00:00'} AND&nbsp;&nbsp; &nbsp;Report.LastSignDate<{ts '2020-10-01 00:00:00'}ORDER BY&nbsp;&nbsp; &nbsp;Report.LastSignDate, PatientInfo.MRN"""cursor.execute(sql)row = cursor.fetchone()conn.close()print(row)&nbsp;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python