【发布时间】:2017-05-04 16:07:11
【问题描述】:
我一直遇到错误,似乎无法在线找到任何解决方案。我目前有一个包含 36 列的 SQL,并且正在使用删除语句,然后每天通过 CSV 和 python 程序插入新值。这是一个基本的 Insert Into 语句,它利用 python for 循环插入 CSV 中的所有行。
我刚刚在 SQL 表和 python 程序中的 insert 语句中添加了一个新列(我过去曾多次对同一个表执行此操作),但是每当我使用新的 insert 语句程序时,我都会得到以下信息错误:
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC SQL Server
Driver][SQL Server]Incorrect syntax near '@P26'. (102) (SQLExecDirectW);
[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could
not be prepared. (8180)")
我假设“@P26”指的是某个参数,但我没有使用任何 SQL 参数。下面是我的 Python / SQL 代码的 sn-p:
SQL = """insert into example_table( [Column_1],
[Column_2],
[Column_3],
[Column_4],
[Column_5],
[Column_6],
[Column_7],
[Column_8],
[Column_9],
[Column_10],
....
[Column_36],
[New Column]
) values (?,?,?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?,?,?,?,?)"""
cursor2.execute("delete example_table")
for row in csv_data:
cursor2.execute(SQL, row)
非常感谢您的帮助,我完全陷入困境。对不起,代码中的奇怪缩进。 (注意:我知道语法是正确的,因为它在我删除新列和参数标记并重新运行时有效)。
【问题讨论】:
-
最有可能的答案是您的字符串或生成的 SQL 在某些时候被截断......在未显示的任何代码中是否存在字符串长度限制?还是在您调用的底层库/API 中?
-
奥斯汀感谢您的回复。我实际上考虑过这一点,因此我将要插入的新列的 varchar 限制设置为最大值。话虽如此,它将达到的最大字符数为 8。就 pyodbc 库而言,我从未遇到任何问题。在任何情况下,表中已经存在的许多列的长度都远大于新列。
-
不,我说的是持有您正在传递给 SQL Server 的 SQL 的字符串。该错误消息似乎表明 SQL 字符串本身正在被截断,因此当它变得太长时会导致语法错误。
-
你的意思是python字符串本身吗?这个线程似乎暗示 python 字符串的最大值是几十或几百 GB:stackoverflow.com/questions/1739913/… 除非它被 ODBC 驱动程序截断? @ls101 您的查询在 SSMS 中有效吗?
-
你能用分析器检查服务器发生了什么吗?你可能会发现你的 SQL 到底出了什么问题
标签: python sql-server parameters sql-insert pyodbc