21

我正在将一些旧的 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 调用中),然后运行第三个查询以删除第一个表。但我宁愿不必诉诸于此!:)

4

6 回答 6

65

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

SET NOCOUNT ON 

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

微软文档

于 2014-01-23T13:39:13.953 回答
14

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

$statement->nextRowset();

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

于 2013-05-24T14:04:14.167 回答
8

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

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

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

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

在此之后,错误不应再出现。

于 2017-06-09T09:15:27.987 回答
7

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

  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
}

希望这可以帮助遇到类似问题的其他人。

于 2017-06-20T17:44:36.323 回答
1

我正在使用 laravel5,这就是我解决问题的方法;

DB::select("SET ANSI_NULLS ON; SET ANSI_WARNINGS ON;EXEC [storedprocedure] $param1,$param2;");
于 2015-04-30T16:19:32.367 回答
1

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

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

它工作完美。

于 2020-05-07T14:44:11.983 回答