You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 15:15:07