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?
T-SQL语言无法识别ODBC转义序列。EXEC是可用于调用存储过程的唯一命令。ODBC转义序列由客户端库(例如ODBC,OLE DB,ADO,ADO.NET)解释,并在执行前即时转换为真正的T-SQL语法。
最终结果是,可以使用客户端从客户端调用顶级存储过程CALL,但是如果该过程调用其他存储过程,则必须使用EXEC。
日期/时间文字转义序列适用相同的原理。