PDO与MSSQL驱动程序如何获取输出参数?
2022-08-30 19:20:52
当您将PDO
与MSSQL驱动程序一起使用时,您实际上使用FreeTDS作为低级驱动程序。有一些不同的方法来执行存储过程 - 语言查询和 RPC 调用。
FreeTDS 还支持 TDS 协议版本 4.2 和 7.x。它们之间的主要区别之一是存储过程调用的行为。Microsoft 将行为从协议 4.2 更改为不返回语言查询输出参数的 7.0。语言查询主要将文本查询发送到服务器,并包装成一个 TDS 数据包。
使用 PDO 进行语言查询的示例(来自 php.net)
$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'Hello!';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);
$stmt->execute();
print "The output is $value\n";
实际上,您发送了类似“EXEC sp_takes....”之类的内容。如果您使用MSSQL运行上面的示例,您将在TDS 7.х中获得空输出参数,并在4.2中获得预期结果。为什么我们不能使用4.2并快乐?它有很多限制:
- 当然,只有ASCII。
- 不支持 RPC 和 BCP。
- varchar 字段限制为 255 个字符。如果您的表定义了较长的字段,则这些字段将被截断。
- 不支持动态查询(也称为 )。
prepared statements
因此,4.2不是变体。
RPC 调用(来自 php.net odbtp 扩展的示例)
$stmt = mssql_init('sp_takes_string_returns_string');
$value = 'Hello!';
mssql_bind($stmt, 1, $value, SQLVARCHAR, true, false, 4000);
mssql_execute($stmt);
print "The output is $value\n";
使用上面的示例和php中的本机mssql扩展,您在TDS 7.2中获得了正确的结果。实际上,您使用该代码发送二进制RPC数据包。
问题
有没有办法使用PDO和MSSQL驱动程序对存储过程进行RPC调用?