PHP如何得到mssql的存储过程的输出参数?

存储过程

<?
$conn=mssql_connect("127.0.0.1","user","passwd");
mssql_select_db("mydb");
$stmt=mssql_init("pr_name",$conn);//
$a=50001;
mssql_bind($stmt,"RETVAL",$val,SQLVARCHAR); //用于直接返回return -103此类的值。
mssql_bind($stmt,"@outvar",$b,SQLVARCHAR,true);//用于返回在存储过程中定义的输出参数
mssql_bind($stmt,"@invar",$a,SQLINT4);
$result = mssql_execute($stmt,true);//不能返回结果集,只能得到输出参数
//$result = mssql_execute($stmt,false); //返回结果集
//$records=mssql_fetch_array($result);
//print_r($records);
//mssql_next_result($result);下一个结果集,当等于FALSE的时候下一个就是输出参数
echo $b;
echo $val;
?>

下面这些是从别的地方看到的。

小麻烦:
我们按照惯例使用了一个MS Sql Server的存储过程procA,它给出了一个输出参数nReturn,
而且返回了一个结果集。
在如何让PHP调用这个procA的时候,我们遭遇了一点小麻烦。

鱼肉和熊掌不可兼得:
我们本来希望这样的代码能够既得到输出参数,又得到返回的结果集:
// 初始化要传进存储过程的参数们:
$nYear = 2004;
$nPageSize = 20;
$nPageNo = 1;
// Initializes a stored procedure:
$stmt = mssql_init("proc_stat_page", $db_mssql->Link_ID);
// 绑定输入参数:
mssql_bind($stmt, "@nReturn", $nReturn, SQLINT4, TRUE);
mssql_bind($stmt, "@nYear", $nYear, SQLINT4);
mssql_bind($stmt, "@nPageSize", $nPageSize, SQLINT4);
mssql_bind($stmt, "@nPageNo", $nPageNo, SQLINT4);
// 执行存储过程,得到QueryID:
$db_mssql->Query_ID = mssql_execute($stmt,false);
虽然得到了结果集,但是,这样$nReturn参数是拿不到输出参数的。

如果把最后一句话改为:
$db_mssql->Query_ID = mssql_execute($stmt,true);
输出参数倒是拿到了,结果集又没有了。

好像是一个鱼肉和熊掌不可兼得的样子。
难道PHP连这个都做不到?PHP手册中也没有讲这个问题。

来自于PHP维护者的解释:
原本我们这种调用办法是PHP 4.3版本之前肯定是支持的。
“但是,自从PHP 4.3版本之后,”他们说,“为了能够兼容存储过程返回多个结果集,PHP改变这个特性。”
“如果你不需要结果集,你应该设置mssql_execute的第二个可选参数为TRUE,这样mssql_execute方法之后你就可以得到输出参数了。”
“如果你需要返回的结果集们,你应该为每一个结果集调用一次mssql_next_result。在最后一个结果集返回之后,你再调用mssql_next_result就会得到返回值FALSE,这时候,你就可以访问输出参数了。”

解决:
在最后我们补上一句话:
// After the last result has been returned the return value will have the value returned by the stored procedure.
mssql_next_result($db_mssql->Query_ID);
立刻,魔法生效了:
PHP填充了正确的输出参数到$nRetVal里。

时间: 2024-10-15 02:24:24

PHP如何得到mssql的存储过程的输出参数?的相关文章

.net调用mysql存储过程中输出参数的问题,求救~~

问题描述 环境.net2.0+mysql5.0.37+Connector/Net5.2问题:在ASP.NET中调用mysql存储过程(输出参数名于存储过程输出参数名不同时),提示输出参数不存在:Parameter'@param1'notfoundinthecollection.当ASP.NET中修改输出参数名于存储过程中输出参数名相同的时候,提示一个新的参数未定义:Parameter'@1118079786param1'mustbedefined.而这个参数变量是自动生成的,在存储过程中我并没有

Sql Server 存储过程调用存储过程接收输出参数返回值

创建存储过程: ALTER PROCEDURE [dbo].[GetCustomers] (@rowcount INT OUTPUT) AS SELECT [CustomerID] ,[CompanyName] ,[ContactName] ,[ContactTitle] ,[Address] ,[City] ,[Region] ,[PostalCode] ,[Country] ,[Phone] ,[Fax] FROM [Northwind].[dbo].[Customers] SET @row

存储过程的输出参数,返回值与结果集_MsSql

每个存储过程都有默认的返回值,默认值为0.下面我们分别看看在management studio中如何查看输出参数,返回值以及结果集,然后我们再在ASP.NET调用存储过程中如何获得输出参数,返回值以及结果集. 首先:在sql server management studio中查看输出参数,返回值以及结果集.本示例以Northwind数据库为例. 复制代码 代码如下: create proc Employee @Rowcount int=0 output as begin SELECT * FRO

存储过程的输出参数,返回值与结果集

每个存储过程都有默认的返回值,默认值为0.下面我们分别看看在management studio中如何查看输出参数,返回值以及结果集,然后我们再在ASP.NET调用存储过程中如何获得输出参数,返回值以及结果集. 首先:在sql server management studio中查看输出参数,返回值以及结果集.本示例以Northwind数据库为例. 复制代码 代码如下: create proc Employee @Rowcount int=0 output as begin SELECT * FRO

DB-Library执行存储过程如何获取输出参数?

问题描述 用DB-Library访问sqlserver2000的存储过程,如果获取存储过程的输出参数:我不懂这个,替别人问的,如果是比较弱智的问题,高手们别笑话,请尽量给出一个例子参考了. 解决方案 解决方案二:路过帮顶=============11月6日,论坛升级公告,积分已经做了调整!http://topic.csdn.net/u/20081107/11/b27dc75f-14b1-4594-9de3-5b18d9e36a11.html此次调整增加了两个新的可用分获取渠道:1:帖子被推荐(加

字符集-mysql 存储过程输出参数中文返回乱码

问题描述 mysql 存储过程输出参数中文返回乱码 我用C++ 通过ODBC访问mysql 数据库,mysql 数据库版本是5.6.12 odbc驱动版本5.2.5 数据库的字符集全部设置为utf8 驱动的字符集也设置为utf8. 程序中通过select直接从表中查出,中文不会乱码, 但通过存储过程的输出参数返回就是乱码. 求大神们帮忙.谢谢 解决方案 在存储过程里查询的时候,指定查询字符集

asp.net实现调用带有输出参数的存储过程实例_实用技巧

本文实例讲述了asp.net实现调用带有输出参数的存储过程.分享给大家供大家参考,具体如下: 前台jqurey <script type="text/javascript"> $(document).ready(function(){ $('#change_image').click(function(){ $('#imgAuthenCode').attr('src','CheckCode.aspx?'+Math.random());}); $("#account

asp.net mssql存储过程输出参数的调用

asp教程.net mssql存储过程输出参数的调用 最简单的语法 create proc p as   select * from tb sql存储过程的概念,优点及语法 整理在学习程序过程之前,先了解下什么是存储过程?为什么要用存储过程,他有那些优点 定义:将常用的或很复杂的工作,预先用sql语句写好并用一个指定的名称存储起来, 那么以后要叫数据库教程提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令. 讲到这里,可能有人要问:这么说存储过程就是一堆sql语

关于存储过程的ADO调用的一些心得(输出参数,返回值)

ado|存储过程|心得 在一个项目中,我需要用到存储过程来访问数据,为了提供一个比较一致的接口以便调用,我没有使用CreateParameter(),而是调用CommandPtr的Refresh()函数先从数据库中查询参数._ConnectionPtr m_pConn;m_pConn.CreateInstance(__uuidof(Connection));m_pConn->Open("driver={SQL Server};server=127.0.0.1;DATABASE=pub;UI