pyodbc执行变量变为@ P1?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (103)

我正在做的事情:

# 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驱动程序] [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(字符串格式)来插入适当的值。

扫码关注云+社区

领取腾讯云代金券