php中不从sql server返回的varchar输出值

php中不从sql server返回的varchar输出值,php,sql-server,Php,Sql Server,我有一个php文件,它执行sql server存储过程并返回一个VARCHAR数据类型的输出值。如果输出值设置为整数,则工作正常。如果输出值设置为varchar,则返回空值。下面是我的php代码和sql server存储过程。请帮助我哪里错了。多谢各位 $retbillno = 'REF'; $sp_name = "{call Stp_Bill(?,?)}"; $params = array( array($massno,

我有一个php文件,它执行sql server存储过程并返回一个VARCHAR数据类型的输出值。如果输出值设置为整数,则工作正常。如果输出值设置为varchar,则返回空值。下面是我的php代码和sql server存储过程。请帮助我哪里错了。多谢各位

$retbillno = 'REF';

    $sp_name = "{call Stp_Bill(?,?)}";

    $params = array(   
                     array($massno,         SQLSRV_PARAM_IN),  
                     array($retbillno,      SQLSRV_PARAM_INOUT)
                   );  


    $stmt3 = sqlsrv_query( $conn, $sp_name, $params);

    if( $stmt3 === false )  
    {  
         echo "Error in executing statement 3.\n";  
         die( print_r( sqlsrv_errors(), true));  
         //die( print_r( "0", true));  
    }  

    else
    {   
        sqlsrv_next_result($stmt3);
        echo $retbillno;

        sqlsrv_free_stmt( $stmt3);  
        sqlsrv_close( $conn);
    }
和存储过程

CREATE PROCEDURE Stp_Bill 
@massno INT,
@retbillno VARCHAR(20) OUTPUT
AS
BEGIN
    SELECT @retbillno='REF02455'
    RETURN
END

我不得不处理数据类型为VARCHAR的C#和SQL输出参数的类似问题。我发现,在用C#声明参数时,我需要提到它的大小

//下面的返回值不会大于someInitialValue中现有值的长度
var myOutParam=新的SqlParameter(“@calculatedParam”,someInitialValue);
myOutParam.Direction=参数Direction.InputOutput;
con.executery(…);
//例如,如果myInitialValue是“A”,并且您从过程中返回了“XYZ”,那么最终值将仅为“X”
var finalValue=myOutParam.值;
解决此问题的正确方法是提供具有预期大小的参数声明


将此转换为您的PHP需求,它将解决您的问题。

当您使用某种输出参数执行过程时,需要将变量声明为输出。这就是说,首先使用输出参数可能是不必要的。请清楚您所说的。我不清楚执行过程时需要声明变量的输出。e、 g.
声明@m int=1;声明@r varchar(20);exec stp_bill@massno=@m,@retbillno=@r输出
但实际上您不需要输出参数,因为您可以在php代码中捕获一个常规的select语句。e、 g.不需要输出,只需将您的过程更改为
select'REF02455'我这样做了,但那不起作用。。请记住,当输出值为整数时,它工作得非常完美。只有当它是varchar数据类型时,它才返回值。但是我需要返回一个varchar值
// The below declaration will return properly
var myOutParam = new SqlParameter("@calculatedParam", someInitialValue);
myOutParam.Direction = ParameterDirection.InputOutput;
myOutParam.Size=3;
con.ExecuteQuery(...);

// if for example myInitialValue was "A" and your returned "XYZ" from the procedure, your finalValue would only be "XYZ"
var finalValue = myOutParam.Value;