我正在转换一些旧的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);
这似乎绕过了错误,但是这个版本的查询非常低效,因为它似乎在另一个查询中为每个字段比较运行temptable查询.
有没有办法让第一个表单(创建一个临时表)与PDO一起使用?
它在使用mssql的旧页面上运行良好.
编辑:我知道我可以通过创建一个真正的表,在PHP中运行它,然后运行第二个查询(在单独的PHP调用中),然后运行第三个查询删除第一个表,以"杂乱"的方式做到这一点.但我宁愿不必诉诸于此!:)
如果您使用的是存储过程,请使用
SET NOCOUNT ON
问题是存储过程返回包含受影响的行数作为第一个结果的结果.
Microsoft文档
PDO引擎将此查询视为返回两个结果集(较旧的mssql引擎可能只忽略了整个查询字符串中的最后一个查询).我已经设法通过使用以下命令跳过第一个结果集(临时表)来使其工作
$statement->nextRowset();
然后$statement->fetch();
正常使用
如果您使用a StoredProcedure
并执行以下操作:
DB::select("EXEC [storedprocedure] $param1,$param2;");
如上所述,PDO
期望该DB::select
语句返回一些数据。但是由于您StoredProcedure
不返回任何数据,因此可以将DB::select
TODB::update
更改为以下内容:
DB::update("EXEC [storedprocedure] $param1,$param2;");
此后,错误将不再出现。
我遇到了这个问题,上面的答案有所帮助,但这里的答案假设:
您可以访问修改sproc SET NOCOUNT ON
并且您想要执行此操作
您确定需要移动到下一个行集
$statement->nextRowset();
在我的情况下,我使用通用方法从多个sprocs拉回数据,我可能会或可能没有这个问题,需要在增加行集之前检查.
我使用了以下内容:
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 }
希望这可以帮助其他人遇到类似的问题.