sql openquery parameters




T-SQL의 CALL과 EXEC의 차이점은 무엇입니까? (2)

중히 여기다:

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 에도 불구하고 문서 가 올바른 구문입니다.

EXECCALL 이 작동하지 않는 이유는 무엇입니까?


MSSQL이 스토어드 프로 시저에서 CALL 문을 수락한다는 문제 (데이터베이스 마이그레이션 중)가 발생했습니다. SQL Management Studio에서는 문제가 발생하지만 쿼리 자체는 성공적으로 실행됩니다.

따라서 다음과 같은 명령문이 실행됩니다.

create procedure spwho
as begin
    call sp_who2
end
go

exec spwho

불행히도 프로 시저가 만들어 지더라도 아무런 결과도 생성되지 않습니다 (그러나 오류나 경고를 생성하지는 않습니다).

따라서 CALL 문은 MSSQL에서 오류를 생성하지 않지만 어쨌든 작동하지 않으므로 사용하지 않아야합니다 .


T-SQL 언어는 ODBC 이스케이프 시퀀스를 인식하지 못합니다. EXEC 는 저장 프로 시저를 호출하는 데 사용할 수있는 유일한 명령입니다. ODBC 이스케이프 시퀀스는 클라이언트 측 라이브러리 (예 : ODBC, OLE DB, ADO, ADO.NET)에 의해 해석되며 실행 전에 실제 T-SQL 구문으로 즉시 변환됩니다.

최종 결과는 원하는 경우 CALL 사용하여 클라이언트에서 최상위 저장 프로 시저를 CALL 할 수 있지만 다른 프로 시저를 호출하는 경우 EXEC 사용해야합니다.

날짜 / 시간 리터럴 이스케이프 시퀀스에도 동일한 원칙이 적용됩니다.





sql-server-2008