python - pyodbc 执行变量变为@P1

标签 python sql-server pyodbc execute

嗨,我正在做类似的事情:

# 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()

它报告错误:

ProgrammingError: ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '@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(字符串格式化)来插入适当的值。

关于python - pyodbc 执行变量变为@P1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50728621/

相关文章:

sql-server - 为什么在 Sql Server 中使用嵌套事务

python - 从 Python 附加到 Access 的 SQL 查询

python - 是否可以使用 Django 模板处理器处理任意内容?

Python查找列表中元素的索引并在另一个列表中删除

sql-server - SQL Server 中的 Try-Catch 存储过程

sql-server - SQL 服务器、pyodbc 和死锁错误

python - 检查 pyodbc 连接是打开还是关闭

python - @property 和 property() 的区别

python - 如何删除 QTreeWidgetItem 的 child

mysql - MySql 中 SqlServer @@Error 的副本