Quelle est la différence entre CALL et EXEC dans T-SQL?
Considérer:
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;
J'ai essayé d'appeler cette procédure avec:
CALL LowerCityDiscounts 'Cleveland', 5;
mais cela ne produit
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'Cleveland'.
Encore, si j'ai changer les choses pour
EXEC LowerCityDiscounts 'Cleveland', 5;
tout fonctionne bien. Ce, malgré que la documentation indiquant que call
est la bonne syntaxe.
Pourquoi ne EXEC
travail quand CALL
ne l'est pas?
source d'informationauteur Billy ONeal | 2011-10-21
Vous devez vous connecter pour publier un commentaire.
Ouais..
CALL
est une construction/syntaxe utilisable à partir d'un pilote ODBC, comme votre documentation indique.Il n'y a pas de référence dans le T-SQL de la documentation à
CALL
seulementEXEC
.Cela ne fonctionne pas car il n'est pas de T-SQL.
Le langage T-SQL ne permet pas de reconnaître les séquences d'échappement ODBC;
EXEC
est la seule commande disponible pour l'appel d'une procédure stockée. ODBC séquences d'échappement sont interprétés par les bibliothèques côté client (par exemple, ODBC, OLE DB, ADO, ADO.NET) et traduit à de vrais T-SQL syntaxe à la volée avant l'exécution.Le résultat final est, vous pouvez appeler votre haut-niveau de la procédure stockée à partir du client à l'aide de
CALL
si vous voulez, mais si la procédure des appels d'autres, il doit utiliserEXEC
.Le même principe s'applique pour la date/heure littérale des séquences d'échappement.
J'ai couru à travers un problème (lors de la migration de bases de données) MSSQL acceptera
CALL
instruction dans une procédure stockée - SQL Management Studio se plaint, mais la requête est exécutée avec succès.Donc une déclaration de ce genre ne execute:
Malheureusement, même si la procédure est créé, il n'a pas produit tous les résultats (mais ne s'agit-il de produire des erreurs ou des avertissements).
Donc dans ce cas la
CALL
instruction n'est pas de produire des erreurs dans MSSQL mais de toute façon ne doit jamais utilisé, car il ne fonctionne pas.