如何使用sqlsrv_prepare绑定存储过程参数@Number?
问题描述
我们有一个他人创建的存储过程,代码如下:
DECLARE @RC int DECLARE @Number varchar(10) -- TODO: Set parameter values here. EXECUTE @RC = [dbo].[spWebGetPrice] @Number GO
我尝试用sqlsrv_prepare为@Number绑定值,写了以下代码,但系统提示参数仍未提供:
$sql = sqlsrv_prepare($conn,"spWebGetPrice", ['@Number', 123456]);
正确的参数绑定写法
你当前的写法存在两处错误:一是调用存储过程时未使用EXEC关键字,二是参数绑定格式不符合sqlsrv_prepare的要求。以下是两种可行的正确写法:
方式一:基础参数绑定
// 用EXEC指定调用存储过程,?作为参数占位符 $sql = "EXEC [dbo].[spWebGetPrice] @Number = ?"; // 定义参数数组:值 + 参数类型(输入参数) $params = array('123456', SQLSRV_PARAM_IN); // 预处理语句 $stmt = sqlsrv_prepare($conn, $sql, $params);
方式二:指定参数类型(匹配存储过程定义)
如果需要严格匹配存储过程中@Number的varchar(10)类型,可以显式声明参数的PHP类型和SQL类型:
$sql = "EXEC [dbo].[spWebGetPrice] @Number = ?"; $numberValue = '123456'; $params = array( array( &$numberValue, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR), SQLSRV_SQLTYPE_VARCHAR(10) ) ); $stmt = sqlsrv_prepare($conn, $sql, $params);
核心注意事项
- 调用存储过程必须通过
EXEC或EXECUTE关键字,不能直接将存储过程名作为SQL语句传入 - 参数绑定需使用
?作为占位符,再通过参数数组传递具体值,不能直接写@Number在数组里 - 如果需要获取存储过程的返回值
@RC,需要额外添加输出参数的绑定逻辑
内容的提问来源于stack exchange,提问作者Capitan Kamote
相关产品推荐
相关产品推荐

