이 구문은 어떻게 작동합니까? {fn CurDate ()} 또는 {fn Now ()} 등


19

최근에 SQL Server 2005 용으로 작성된 상당히 오래된 저장 프로 시저를 살펴 봤는데 이해하지 못하는 내용이 있습니다. 일부 유형의 함수 호출 인 것 같습니다.

샘플:

SELECT o.name, o.type_desc, o.create_date
FROM sys.objects o
WHERE o.create_date < {fn Now()} -1;

이 모든 행이 표시됩니다 sys.objectscreate_date이전 24 시간 전.

이 쿼리에 대한 실행 계획을 표시 하면 데이터베이스 엔진으로 {fn Now()}대체됩니다 getdate().

SELECT [o].[name],[o].[type_desc],[o].[create_date] 
FROM [sys].[objects] [o] 
WHERE [o].[create_date]<(getdate()-@1)

분명히 사용하는 {fn Now()}것보다 훨씬 더 애매합니다 GetDate(). 나는이 문서가 문서화되어 있지 않기 때문에 전염병과 같은이 구문을 피할 것입니다.

답변:


25

ODBC 이스케이프 구문이며 엔진은 실행 계획에서 본 것과 같이 자체 구현이 무엇인지 알고 스왑 아웃합니다. 다음과 같은 다른 것들도 있습니다 :

SELECT {fn curdate()},
       {ts '2016-05-24 15:19:36'}, -- not vulnerable to SET LANGUAGE!
       {guid 'D08891B4-BC25-4C7C-BAEF-3B756055AC6E'};

여기 , 여기 , 여기 그리고 가장 중요한 문서를 참조 하십시오 . 그러나이 구문에 대해 조사하고 배우지 마십시오. IMHO 당신은 대부분의 경우 기본 구문을 사용해야하며 결코 들어 본 적이 없습니다.

또한 getdate()-1특히 이전 코드로 돌아가서 업데이트하는 경우 속기 에도 강력히 권장 합니다. DATEADD내재 된 속기는 새 유형에서 작동하지 않으므로 명시 적이며 사용하십시오 . 예를 들어 다음을 시도하십시오.

DECLARE @d DATE = GETDATE();
SELECT @d - 1;

결과:

메시지 206, 수준 16, 상태 2, 줄 2
피연산자 유형 충돌 : 날짜가 int와 호환되지 않습니다

10 년 안에 코드를 실제로 보호하려면 세미콜론도 추가 할 수 있습니다.


이 이스케이프 구문은 JDBC에서도 지원됩니다.
a_horse_with_no_name
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.