sp_executesql - execute stored procedure sql server example
¿Cuál es la diferencia entre CALL y EXEC en T-SQL? (3)
El lenguaje T-SQL no reconoce las secuencias de escape ODBC; EXEC
es el único comando disponible para llamar a un procedimiento almacenado. Las secuencias de escape ODBC son interpretadas por las bibliotecas del lado del cliente (por ejemplo, ODBC, OLE DB, ADO, ADO.NET) y se traducen a la sintaxis T-SQL real sobre la marcha antes de la ejecución.
El resultado final es que puede llamar a su procedimiento almacenado de alto nivel desde el cliente usando CALL
si lo desea, pero si ese procedimiento llama a otros, debe usar EXEC
.
El mismo principio se aplica a las secuencias de escape literales de fecha / hora.
Considerar:
CREATE PROCEDURE LowerCityDiscounts @city VARCHAR(45), @decrease DECIMAL(10,2) AS
BEGIN
BEGIN TRANSACTION;
UPDATE Customers SET discnt = discnt - @decrease
WHERE Customers.city = @city;
UPDATE Customers SET discnt = 0
WHERE Customers.city = @city AND discnt < 0
COMMIT;
END;
Intenté llamar a este procedimiento con:
CALL LowerCityDiscounts ''Cleveland'', 5;
pero esto solo produce
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ''Cleveland''.
Sin embargo, si cambio las cosas a
EXEC LowerCityDiscounts ''Cleveland'', 5;
todo funciona bien Esto a pesar de que la documentación que indica que la call
es la sintaxis correcta.
¿Por qué EXEC
funciona cuando CALL
no?
Me encontré con un problema (al migrar bases de datos) de que MSSQL aceptará la instrucción CALL
en un procedimiento almacenado: SQL Management Studio se queja, pero la consulta se ejecuta correctamente.
Así que una declaración como esta ejecuta:
create procedure spwho
as begin
call sp_who2
end
go
exec spwho
Desafortunadamente, aunque se haya creado el procedimiento, no produce ningún resultado (pero tampoco produce ningún error o advertencia).
Por lo tanto, en casos como este, la instrucción CALL
no producirá errores en MSSQL, pero de todos modos nunca se debe usar, ya que no funciona .
Sí. CALL
es una construcción / sintaxis que se puede utilizar desde un controlador ODBC, como lo indica su documentación.
No hay referencias en la documentación de T-SQL a CALL
, solo EXEC
.
No funciona porque no es T-SQL.