instalar - microsoft drivers for php 7.2 for sql server
PDO con controlador MSSQL ¿Cómo obtener parámetros de salida? (2)
Cuando está utilizando PDO
con controlador MSSQL, en realidad usa FreeTDS como controlador de bajo nivel. Hay varias formas diferentes de ejecutar procedimientos almacenados: consultas de idioma y llamada RPC .
FreeTDS también admite la versión 4.2 y 7.x del protocolo TDS. La diferencia principal entre ellos es el comportamiento de la llamada a un procedimiento almacenado. Microsoft cambió el comportamiento del protocolo 4.2 a 7.0 y no devolvió los parámetros de salida de las consultas de idioma. Las consultas de idioma envían principalmente la consulta de texto al servidor que se envuelve en un paquete TDS.
Ejemplo de consulta de idioma con DOP (desde 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";
En realidad envías algo como "EXEC sp_takes ....". Y si ejecuta el ejemplo anterior con MSSQL, obtendría un parámetro de salida vacío en TDS 7.х y el resultado esperado con 4.2. ¿Por qué no podemos usar 4.2 y ser felices? Tiene muchas limitations :
- Sólo ASCII, por supuesto.
- RPC y BCP no son compatibles.
- los campos varchar están limitados a 255 caracteres. Si su tabla define campos más largos, se truncarán.
- Las consultas dinámicas (también llamadas
prepared statements
) no son compatibles.
Entonces, el 4.2 no es una variante.
Ejemplo de llamada RPC (de php.net odbtp extension )
$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";
Usando el ejemplo anterior con la extensión mssql nativa en php, obtuvo el resultado correcto con TDS 7.2. En realidad, usted envía un paquete RPC binario con ese código.
Pregunta
¿Hay alguna forma de realizar una llamada RPC para el procedimiento almacenado con el controlador PDO y MSSQL?
O perdí FreeTDS cuando contesté por primera vez, o esta pregunta se actualizó. De cualquier manera...
FreeTDS no admite parámetros de salida en MSSQL Server 7 SP3 o superior. Esto se debe a los cambios realizados en SQL Server.
--- Respuesta anterior abajo ---
Sé que no es exactamente lo que estás buscando.
Corrí a través de algunos archivos antiguos hasta la única vez que había vinculado a MSSQL y saqué esto.
$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."");
espero que esto ayude
Prueba esto
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);