当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《"使用PDO和MSSQL,活动结果不包含任何字段"》经验,为你挑选了4个好方法。

我正在转换一些旧的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调用中),然后运行第三个查询删除第一个表,以"杂乱"的方式做到这一点.但我宁愿不必诉诸于此!:)



1> 小智..:

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

SET NOCOUNT ON 

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

Microsoft文档



2> MrVimes..:

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

$statement->nextRowset();

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



3> Rahul Gupta..:

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

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

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

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

此后,错误将不再出现。



4> Bryan..:

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

    您可以访问修改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
}

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

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有