2015-01-06 48 views
2

我想從使用pyodbc的python程序使用Microsoft的ODBC 11 SQL驅動程序插入Microsoft SQL Server數據庫。 (這是一口) 所以我測試了連接,子查詢,並在單獨的查詢中使用dateadd。這些都有效,但是當我試圖將它們放在這個插入語句中時,我在倒數第二行的倒數第二個'''處得到語法錯誤。我在這裏錯過了什麼?使用MS SQL的插入語法錯誤ODBC

cursor.execute("INSERT INTO room_use_log VALUES ("+ 
     "(SELECT bldg_flr_spc_id FROM bldg_flr_spc WHERE rm_atl_nbr="+ 
     rooms[y]["Name"] +"),'t','f',dateadd(ms,"+ 
     str(int(str(r.get(rooms[y]["Name"]))[1:])) +", '1970-01-01'),"+ 
     " dateadd(ms,"+ 
     str(int(time.time())) + 
     ", '1970-01-01')" #<----that one 
     ) 

這是整個錯誤:

Traceback (most recent call last): 
    File "DBGetRedis.py", line 59, in <module> 
    ", '1970-01-01')" 
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 11 for SQL Server] 
[SQL Server]Incorrect syntax near ')'. (102) (SQLExecDirectW)") 

回答

4

看來你缺少你的INSERT語句收盤括號。字符串中的最後一個paren正在關閉dateadd,您仍然需要另一個關閉VALUES部分。嘗試:

cursor.execute("INSERT INTO room_use_log VALUES ("+ 
    "(SELECT bldg_flr_spc_id FROM bldg_flr_spc WHERE rm_atl_nbr='"+ 
    rooms[y]["Name"] +"'),'t','f',dateadd(ms,"+ 
    str(int(str(r.get(rooms[y]["Name"]))[1:])) +", '1970-01-01'),"+ 
    " dateadd(ms,"+ 
    str(int(time.time())) + 
    ", '1970-01-01'))" #<----that one 
    ) 

編輯:都增加了在評論中提及以下修復該語句的單引號。

+0

它總是在你的鼻子下面。 – Sev09

+0

雅...我是配對括號,但引號中的那些很難檢查。在我的發言中還有一個錯誤,提到獲得upvote。在where子句和另一側的等號後添加「'」。 – schumacherj

+3

需要考慮的另一件事是:避免像SQL注入這樣的問題使用綁定參數是一種更好的做法。文檔在這裏:https://code.google.com/p/pyodbc/wiki/Cursor但是對於一個簡短的例子,你可以運行你的select,把它放到變量中,然後像這樣執行語句:cursor .execute(「INSERT INTO room_use_log(thisroom,thatroom,otherroom)VALUES(?,?,?)」,pyv_thisroom,pyv_thatroom,pyv_otherroom)「)任何以pyv *開頭的東西都是select中的Python變量。 ,目前睡眠不足! – FlipperPA