“活动结果不包含字段”使用带有 MS SQL 的 PDO

2022-08-30 19:21:58

我正在转换一些旧的PHP页面以使用PDO。

以下是两个简化的查询(不是我的实际查询),以帮助理解我遇到的问题...

SELECT afield INTO #temptable FROM atable WHERE anotherfield = 'somevalue';

SELECT afield,anotherfield,onemorefield FROM atable 
WHERE afield NOT IN (SELECT * FROM #temptable);

上面的查询会引发标题中描述的错误(更完全地会引发“致命错误:未捕获的异常'PDOException',并带有消息'SQLSTATE[IMSSP]:查询的活动结果不包含任何字段。

如果我像这样更改查询...

with (SELECT afield INTO #temptable FROM atable 
WHERE anotherfield = 'somevalue') AS temptable;

SELECT afield,anotherfield,onemorefield FROM atable 
where afield NOT IN (SELECT * FROM temptable);

这似乎可以绕过错误,但是这个版本的查询效率非常低下,因为它似乎对另一个查询中的每个字段比较都运行了诱人的查询。

有没有办法使第一个窗体(创建一次临时表)与 PDO 一起使用?

它在使用mssql的旧页面上工作正常。

编辑:我知道我可以通过创建一个真正的表,在php中运行它,然后运行第二个查询(在单独的php调用中),然后运行第三个查询来删除第一个表,从而以“混乱”的方式做到这一点。但我宁愿不必诉诸于此!:)


答案 1

如果您使用的是存储过程,则使用

SET NOCOUNT ON 

问题是存储过程返回的结果包含受影响的行数作为第一个结果。

微软文档


答案 2

PDO 引擎将此查询视为返回两个结果集(较旧的 mssql 引擎可能只是忽略了整个查询字符串中除最后一个查询之外的所有查询)。我通过使用以下命令跳过第一个结果集(临时表)来设法使其工作

$statement->nextRowset();

然后像往常一样使用$statement->fetch();


推荐