我正在尝试使用ODBC从PHP调用MSSQL存储过程,我想它相当有效。我的意思是,该过程被调用。我没有错。但是我在检索输出参数时遇到了一些麻烦。
该过程不返回任何内容,但是有一个输出参数,它是一个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;
所有输入参数可以为null,我需要检索的参数为@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驱动程序不支持过程输出参数...
是真的吗?还有其他办法吗?
答案 0 :(得分:0)
您可以尝试将输出参数的值转换为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>
注意:
请考虑使用PHP Driver for SQL Server。该驱动程序完全支持存储过程的输入和输出参数。