PDO с драйвером MSSQL, как получить выходные параметры?
Когда вы используете 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 не является вариантом.
$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";
Используя пример выше с собственным расширением mssql в php, вы получили правильный результат с помощью TDS 7.2. Фактически вы отправляете бинарный пакет RPC с этим кодом.
Вопрос
Есть ли способ сделать вызов RPC для хранимой процедуры с драйверами PDO и MSSQL?
Ответы
Ответ 1
Либо я пропустил 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);