亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

T-SQL 語句在 SQL Server 中有效,但是當我在 Python 中使用它時,它總是出錯

T-SQL 語句在 SQL Server 中有效,但是當我在 Python 中使用它時,它總是出錯

梵蒂岡之花 2023-10-11 16:12:27
我可以通過 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) 
查看完整描述

2 回答

?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

因為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

? ? ?"""


查看完整回答
反對 回復 2023-10-11
?
HUH函數

TA貢獻1836條經驗 獲得超4個贊

你的sql語法中有幾個錯誤,執行連接時不需要額外的括號“((”。你不必擔心縮進SQL語句,但是python縮進和換行可能有點棘手。為了簡化你的代碼,你可以在Python中利用多行字符串(即使用""" some string """),例如。


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, 

    Orders.ProcedureDescList, 

    Visit.Facility, 

    Orders.CompleteDate, 

    Orders.FillerOrderNumber 

FROM 

    Comm4.dbo.Order Orders  

INNER JOIN 

    Comm4.dbo.Report Report ON Orders.ReportID=Report.ReportID

INNER JOIN 

    Comm4.dbo.Visit Visit ON Orders.VisitID=Visit.VisitID

INNER JOIN 

    Comm4.dbo.PatientInfo PatientInfo ON PatientInfo.PatientID=Visit.PatientID

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) 


查看完整回答
反對 回復 2023-10-11
  • 2 回答
  • 0 關注
  • 122 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號