php - 如何使用 ODBC 在 PHP 中调用 MSSQL 存储过程并检索输出参数
问题描述
我正在尝试使用 ODBC 从 PHP 调用 MSSQL 存储过程,我想它是相当有效的。我的意思是,该过程被调用。我没有错误。但是我在检索输出参数时遇到了一些麻烦。
该过程不返回任何内容,但它有一个输出参数,即 a varchar
,我需要获取此数据。
这是SQL中的代码:
CREATE PROCEDURE [dbo].[ProcName]
@peCodFact varchar(max) = NULL,
@peCodsAlmcs varchar(max) = NULL,
@peFechaConfDesde date = NULL,
@peFechaConfHasta date = NULL,
@peCodMed varchar(50) = NULL,
@psRegEjec varchar(max) = '<>' OUTPUT
AS
BEGIN TRY
/* data processing where @psRegEjec is set */
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() AS ErrorState, ERROR_PROCEDURE() AS ErrorProcedure, ERROR_LINE() AS ErrorLine, ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
所有输入参数都可以为空,我需要检索的参数是@psRegEjec
.
这是PHP中的代码:
$idCon = odbc_connect($dns, $user, $passwd);
if (empty($idCon))
throw new Exception(odbc_errormsg());
$query = 'DECLARE @psRegEjec varchar(max); ';
$query .= 'EXEC BDName.dbo.ProcName @psRegEjec = @psRegEjec OUTPUT; ';
$query .= 'SELECT @psRegEjec AS data; ';
$res = odbc_exec($idCon, $query);
$datosRes = @odbc_fetch_array($res);
我尝试使用 , 检索结果,并且都得到相同的odbc_fetch_object
结果odbc_fetch_array
。我得到的结果是......
\x0ø\x14\x7cen\x0)\x0\x0\x0\x11\x0\x0\x0Hø\x11\x7ado_nm_grupo_gestion\x0\xEÔ\x0\x18\r\x12\x7)\x0\x0\x0)\ x0\x0\x0~ø\x11\x7ccion_co_descripcion\x0\xF\x12\x7è\x11\x12\x7)\x0\x0\x0)\x0\x0\x0 ø\x11\x7ado_nm_funcionalidad\x0\xEÔ\x0P \x16\x12\x7)\x0\x0\x0)\x0\x0\x0 ù\x11\x7orporacion_descripcion\x0\x7 \x1B\x12\x7)\x0\x0\x0)\x0\x0\x0pø\ x11\x7raseña 前部\x0\x0^\x1F\x12\x7\x19\x0\x0\x0)\x0\x0\x0hú\x11\x7ripcion\x0\x0\x0\x0\x0y\x0\x0\x0\ x19\x0\x0\x0\xF\x1。
它继续,相当大......所以我真的不知道该怎么办。我在一些文章中看到,需要创建第二个过程,从第一个返回输出参数,因为 ODBC 驱动程序不支持过程输出参数......
真的是这样吗?还有其他方法吗?
解决方案
您可以尝试将输出参数的值转换为nvarchar(max)
. 如果您的存储过程执行 SELECT 语句,那么您将有多个结果集。接下来是工作示例:
存储过程:
CREATE PROCEDURE [dbo].[ProcNameODBC]
@peCodFact varchar(max) = NULL,
@peCodsAlmcs varchar(max) = NULL,
@peFechaConfDesde date = NULL,
@peFechaConfHasta date = NULL,
@peCodMed varchar(50) = NULL,
@psRegEjec varchar(max) = '<>' OUTPUT
AS
BEGIN TRY
-- Your actual result set
SELECT [Column] AS [Result] FROM [Table]
-- Output parameter
SET @psRegEjec = 'Value for the output parameter'
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
PHP:
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta charset="utf-8">
<?php
$sql_server = "server\instance,port";
$sql_user = "uid";
$sql_password = "pwd";
$sql_database = "database";
$sql_conn_string = 'Driver={SQL Server Native Client 11.0};Server='.$sql_server.';Database='.$sql_database.';';
if ($sql_conn = odbc_connect($sql_conn_string, $sql_user, $sql_password)) {
$sql = "EXEC ProcNameODBC";
$sql = 'DECLARE @psRegEjec varchar(max); ';
$sql .= 'EXEC ProcNameODBC @psRegEjec = @psRegEjec OUTPUT; ';
$sql .= 'SELECT CONVERT(nvarchar(max), @psRegEjec) AS [Result]; ';
#$sql .= 'SELECT @psRegEjec AS [Result]; ';
# Result set from stored procedure
$result = odbc_exec($sql_conn, $sql);
while (odbc_fetch_row($result)) {
$value = odbc_result($result, "Result");
echo $value.'</br>';
}
# SELECT output parameter
odbc_next_result($result);
while (odbc_fetch_row($result)) {
$value = odbc_result($result, "Result");
echo $value.'</br>';
}
}
?>
</head>
<body></body>
</html>
笔记:
考虑使用SQL Server 的 PHP 驱动程序。该驱动程序完全支持存储过程的输入和输出参数。
推荐阅读
- css - react-player 响应与脉轮 UI
- vba - VBA - MS 项目 - 为持续时间字段添加空间
- database-connection - SymmetricDS 示例 - 客户端节点拒绝连接到服务器节点
- javascript - 尽管已初始化,Javascript变量仍为空
- python - 如何将用户输入附加到类实例中的列表?
- powershell - 如何设置组策略以使用 Powershell 在 Active Directory 中的每个用户上设置登录脚本?
- windows - Visual Studios 在构建项目时反复出现 PDB API 调用失败
- caching - 如何在 MS Teams 客户端 SPFX Webpart 中实现缓存
- rust - 返回向量
从函数 - python - NumPyarray 到 QPixmap