const char* sqlstr = "select count(id) from ?";
sqlite_prepare_v2(mConn, sqlstr, -1, &smtm, NULL)
函数返回错误,错误消息来自sqlite3_errmsg(mConn)
;它提示near "?": syntax error
为什么?
select ? from account
将通过。
在 SQLite(或任何其他 SQL 引擎)中,您只能将参数化变量用作插入、更新或约束的值。当用作左值时,不能在 SQL 语句的任意部分使用它来代替关键字、表名或列名。
这是因为 SQLite 必须解析您的 SQL 语句并决定如何将它与其他表连接,使用哪些索引以及类似的决定,然后这些决定将成为查询计划。
第二个示例中的动态绑定变量不会更改查询计划并且可以使用,但是更改表名会 - 而且 SQLite 根本不喜欢它。
如果确实需要动态提供表名,可以在代码中动态生成 SQL 字符串,然后将该字符串传递给 SQLite,这样表名就已经存在(而不是 as ?
)。