stored sp_executesql example ejecutar sql sql-server tsql sql-server-2008

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.