嗨,我正在做类似的事情:
# pyodbc extension
cursor.execute("select a from tbl where b=? and c=?", x, y)
-- 查询中的某些值由变量提供。但有时该变量被解释为@P1
在查询中。
例如:
import pyodbc
ch = pyodbc.connect('DRIVER={SQL Server};SERVER=xxxx;DATABASE=xxx;Trusted_Connection=True')
cur = ch.cursor()
x = 123
cur.execute('''
CREATE TABLE table_? (
id int IDENTITY(1,1) PRIMARY KEY,
obj varchar(max) NOT NULL
)
''', x).commit()
这会产生一个名为的新表table_@P1
(我想table_123
)
另一个例子:
x = 123
cur.execute('''
CREATE TABLE table_2 (
id int IDENTITY(1,1) PRIMARY KEY,
obj varchar(?) NOT NULL
)
''', x).commit()
它报告错误:
编程错误:('42000',“[42000] [Microsoft][ODBC SQL Server
驱动程序][SQL Server]“@P1”附近的语法不正确。 (102)
(SQLExecDirectW)")
同样,该变量被解释为@P1
.
有人知道怎么修这个东西吗?任何帮助表示赞赏。谢谢-
在第一种情况下,参数替换不适用于表/列名称。这对于绝大多数(如果不是全部)数据库平台来说都是常见的。
在第二种情况下,SQL Server 似乎不支持 DDL 语句的参数替换。 SQL Server ODBC 驱动程序转换 pyodbc 参数占位符 (?
) 到 T-SQL 参数占位符 (@P1
, @P2
, ...) 所以传递给 SQL Server 的语句是
CREATE TABLE table_2 (id int IDENTITY(1,1) PRIMARY KEY, obj varchar(@P1) NOT NULL
具体来说
exec sp_prepexec @p1 output,N'@P1 int',N'CREATE TABLE table_2 (id int IDENTITY(1,1) PRIMARY KEY, obj varchar(@P1) NOT NULL',123
当 SQL Server 尝试准备该语句时,它需要一个文字值,而不是参数占位符。
因此,在这两种情况下,您都需要使用动态 SQL(字符串格式化)来插入适当的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)