活动结果不包含任何字段"使用PDO与MS SQL


"The active result contains no fields" using PDO with MS SQL

我正在将一些旧的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的旧页面上运行良好。

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

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

SET NOCOUNT ON 

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

微软文档

PDO引擎将此查询视为返回两个结果集(旧的mssql引擎可能会忽略整个查询字符串中除了最后一个查询之外的所有查询)。通过使用以下命令

跳过第一个结果集(临时表),我成功地使其工作。
$statement->nextRowset();

然后使用$statement->fetch();作为正常

如果您正在使用StoredProcedure并执行以下操作:

DB::select("EXEC [storedprocedure] $param1,$param2;");

如上所述,PDO期望DB::select语句返回一些数据。但是,由于您的StoredProcedure不返回任何数据,您可以将 DB::select更改为DB::update ,如下所示:

DB::update("EXEC [storedprocedure] $param1,$param2;");

我遇到了这个问题,上面的答案有所帮助,但这里的答案假设:

  1. 您可以使用SET NOCOUNT ON和您修改进程
  2. 您确定需要移动到下一个行集$statement->nextRowset();

在我的情况下,我使用通用方法从多个进程中拉回数据,我可能会或可能不会有这个问题,需要在增加行集之前进行检查。

我使用了以下语句:

while($stmt->columnCount() === 0 && $stmt->nextRowset()) {
    // Advance rowset until we get to a rowset with data
}
if($stmt->columnCount() > 0) {
    // We found something with data, do stuff.
    // Code here
}

希望这对遇到类似问题的人有所帮助

我在这个版本中使用的是Laravel5,你应该执行

DB::select('SET NOCOUNT ON; EXEC stored_procedure'. $param1.','...$paramN);

效果很好

我正在使用laravel5,这就是我如何解决这个问题;

DB::select("SET ANSI_NULLS ON; SET ANSI_WARNINGS ON;EXEC [storedprocedure] $param1,$param2;");