T-SQL中CALL和EXEC有什么区别?

Bil*_*eal 18 sql t-sql sql-server sql-server-2008

考虑:

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;
Run Code Online (Sandbox Code Playgroud)

我尝试用以下方法调用此过程:

CALL LowerCityDiscounts 'Cleveland', 5;
Run Code Online (Sandbox Code Playgroud)

但这只会产生

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'Cleveland'.
Run Code Online (Sandbox Code Playgroud)

但是,如果我改变了

EXEC LowerCityDiscounts 'Cleveland', 5;
Run Code Online (Sandbox Code Playgroud)

一切正常.尽管文档说明这call是正确的语法.

为什么不EXEC工作CALL

Kie*_*one 18

Yup .. CALL是可以从ODBC驱动程序使用的构造/语法,如文档所示.

CALL仅在T-SQL文档中没有引用EXEC.

它不起作用,因为它不是T-SQL.


Chr*_*ter 5

T-SQL语言无法识别ODBC转义序列。EXEC是可用于调用存储过程的唯一命令。ODBC转义序列由客户端库(例如ODBC,OLE DB,ADO,ADO.NET)解释,并在执行前即时转换为真正的T-SQL语法。

最终结果是,可以使用客户端从客户端调用顶级存储过程CALL,但是如果该过程调用其他存储过程,则必须使用EXEC

日期/时间文字转义序列适用相同的原理。