PDO与MSSQL驱动程序如何获取输出参数?

2022-08-30 19:20:52

当您将PDOMSSQL驱动程序一起使用时,您实际上使用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调用?


答案 1

要么是我第一次回答FreeTDS时错过了FreeTDS,要么是这个问题被更新了。无论哪种方式...

FreeTDS 不支持 MSSQL Server 7 SP3 或更高版本中的输出参数。这是由于在 SQL Server 中所做的更改。

---以下为旧回复---

我知道这并不完全是你要找的。
我浏览了一些旧文件,直到我唯一一次链接到MSSQL并拉出它。

$con = mssql_connect($db['host'], $db['user'], $db['pass']);
mssql_select_db($db['database'], $con);//Select DB
$result = mssql_query("my_Procedure_Name ".$propertyOne.", ".$propertyTwo."");

我希望这有帮助


答案 2

试试这个

 try {
    $hostname = "myhost";
    $port = 10060;
    $dbname = "tempdb";
    $username = "dbuser";
    $pw = "password";
    $dbh = new PDO ("dblib:host=$hostname:$port;dbname=$dbname","$username","$pw");
  } catch (PDOException $e) {
    echo "Failed to get DB handle: " . $e->getMessage() . "\n";
    exit;
  }
  $stmt = $dbh->prepare("select name from master..sysdatabases where name = db_name()");
  $stmt->execute();
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
  unset($dbh); unset($stmt);

推荐