当PDO
与MSSQL driver一起使用时,您实际上使用FreeTDS作为低级别驱动程序。有一些不同的方法可以执行存储过程 - 语言查询和RPC call。
FreeTDS还支持TDS协议版本4.2和7.x.它们之间的主要区别之一是存储过程调用的行为。 Microsoft将协议4.2的行为更改为7.0 不从语言查询返回输出参数。 语言查询主要将文本查询发送到包含在TDS数据包中的服务器。
$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运行上面的示例,您将获得TDS7.х中的空输出参数和4.2的预期结果。为什么我们不能使用4.2并且开心?它有很多limitations:
prepared statements
)。所以,4.2不是变种。
$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调用?
答案 0 :(得分:2)
当我第一次回答时,我或者错过了FreeTDS,或者这个问题已经更新了。 无论哪种方式......
FreeTDS不支持MSSQL Server 7 SP3或更高版本中的输出参数。这是由于SQL Server中的更改。
---以下的旧回应---
我知道这并不是你想要的 我经历了一些旧文件到我唯一一次链接到MSSQL并将其拉出来。
igraph
我希望这会有所帮助
答案 1 :(得分:-4)
试试这个
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);