В чем разница между CALL и EXEC в T-SQL? - PullRequest
17 голосов
/ 21 октября 2011

Рассмотрим:

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;

Я пытался вызвать эту процедуру с помощью:

CALL LowerCityDiscounts 'Cleveland', 5;

но это только производит

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'Cleveland'.

Тем не менее, если я изменю вещи на

EXEC LowerCityDiscounts 'Cleveland', 5;

все отлично работает. И это несмотря на то, что документация заявляет, что call - правильный синтаксис.

Почему EXEC работает, когда CALL не работает?

Ответы [ 3 ]

16 голосов
/ 21 октября 2011

Да .. CALL - это конструкция / синтаксис, используемый из драйвера ODBC, как указывает ваша документация.

В документации T-SQL нет ссылки на CALL, только EXEC.

Это не работает, потому что это не T-SQL.

5 голосов
/ 21 октября 2011

Язык T-SQL не распознает escape-последовательности ODBC; EXEC - единственная доступная команда для вызова хранимой процедуры. Экранирующие последовательности ODBC интерпретируются клиентскими библиотеками (например, ODBC, OLE DB, ADO, ADO.NET) и преобразуются в настоящий синтаксис T-SQL на лету перед выполнением.

Конечным результатом является то, что вы можете вызвать хранимую процедуру верхнего уровня из клиента, используя CALL, если хотите, но если эта процедура вызывает другие, она должна использовать EXEC.

Тот же принцип применяется к буквенным escape-последовательностям даты / времени.

2 голосов
/ 29 апреля 2014

Я столкнулся с проблемой (при переносе баз данных), что MSSQL будет принимать оператор CALL в хранимой процедуре - SQL Management Studio жалуется, но сам запрос выполняется успешно.

Таким образом, подобное утверждение выполняется:

create procedure spwho
as begin
    call sp_who2
end
go

exec spwho

К сожалению, несмотря на то, что процедура создана, она не дает никаких результатов (но также не выдает никаких ошибок или предупреждений).

Таким образом, в подобных случаях оператор CALL не приведет к ошибкам в MSSQL, но в любом случае никогда не следует использовать, поскольку он не работает .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...