COUNT 字段不正确或语法错误 (0) (SQLExecDirectW)')
Posted
技术标签:
【中文标题】COUNT 字段不正确或语法错误 (0) (SQLExecDirectW)\')【英文标题】:COUNT field incorrect or syntax error (0) (SQLExecDirectW)')COUNT 字段不正确或语法错误 (0) (SQLExecDirectW)') 【发布时间】:2022-01-09 12:34:55 【问题描述】:运行我的代码时收到错误消息,如下所示:
DBAPIError: (pyodbc.Error) ('07002', '[07002] [Microsoft][ODBC SQL Server Driver]COUNT field incorrect or syntax error (0) (SQLExecDirectW)')
[SQL: INSERT INTO #temptable VALUES (?,?,?,?,?,?,?,?,?)]
(Background on this error at: http://sqlalche.me/e/14/dbapi)
我曾经运行它来将我的数据导入 SQL:
conn= urllib.parse.quote_plus("DRIVER=SQL Server; SERVER=ABCDEF; Database=ABC; UID=user123; PWD=user123;")
engine = sa.create_engine('mssql+pyodbc:///?odbc_connect='.format(conn))
with engine.begin() as con:
con.execute("""
CREATE TABLE #temptable (
[a] NVARCHAR(100)
, [b] NVARCHAR(100)
, [c] NVARCHAR(100)
, [d] NVARCHAR(100)
, [e] NVARCHAR (100)
, [f] NVARCHAR (100)
, [g] NVARCHAR(100)
, [h] FLOAT
, [i] NVARCHAR(100))""")
sql_insert = f"INSERT INTO #temptable VALUES (?,?,?,?,?,?,?,?,?)"
con.execute(sql_insert, data.values.tolist())
sql_merge = """
MERGE data_final AS Target
USING #temptable AS Source
ON Source.a = Target.a
WHEN NOT MATCHED BY Target THEN
INSERT ([a], [b], [c], [d], [e], [f], [g], [h], [i])
VALUES (source.a, source.b, source.c, source.d, source.e, source.f, source.g, source.h, source.i)
WHEN MATCHED THEN
UPDATE SET
Target.h = Source.h
, Target.i = Source.i;"""
con.execute(sql_merge)
con.execute("""DROP TABLE IF EXISTS #temptable;""")
有人知道我的代码有什么问题吗? 因为在我添加更多 2 参数之前很好
【问题讨论】:
【参考方案1】:根据标签猜测,当您应该使用 executemany
时,您似乎正在将一个从 pandas 数据帧生成的列表发送到 execute
。顺便说一句,请考虑to_numpy
建议在DataFrame.values
文档中。最后,prepared statement 不需要 f-string。
sql_insert = "INSERT INTO #temptable VALUES (?,?,?,?,?,?,?,?,?)"
vals = data.to_numpy().tolist()
con.executemany(sql_insert, vals)
实际上,您甚至不需要临时表,但它可能有助于在非常大的数据集上运行 MERGE
在单个集合而不是迭代值上。
sql_merge = """MERGE data_final AS Target
USING (VALUES(?,?,?,?,?,?,?,?,?))
AS Source ([a], [b], [c], [d], [e], [f], [g], [h], [i])
ON Source.a = Target.a
WHEN NOT MATCHED BY Target THEN
INSERT ([a], [b], [c], [d], [e], [f], [g], [h], [i])
VALUES (source.a, source.b, source.c, source.d, source.e,
source.f, source.g, source.h, source.i)
WHEN MATCHED THEN
UPDATE SET Target.h = Source.h
, Target.i = Source.i;
"""
vals = data.to_numpy().tolist()
con.executemany(sql_merge, vals)
【讨论】:
以上是关于COUNT 字段不正确或语法错误 (0) (SQLExecDirectW)')的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用多个值插入 SQL Server 时出现不正确的语法错误
语法错误或访问冲突:1064 您的 SQL 语法有错误;对应于正确语法的 MySQL 服务器版本
RODBC 与 ms-access 错误 07002 17 [Microsoft][ODBC Microsoft Access Driver]COUNT 字段不正确