[MSSQL] SQL2000 이하버전에서는 함수 내에서 비확정적 시스템 함수를 사용할 수 없다.

2009. 2. 16. 15:09Coders

오랜만에 Coders 카테고리의 글을 올립니다.
이런 거 나올 때 마다 좀 적어 놓아야 하는데 흐으.

SQL2005 에서 무심결에 사용자 정의 함수를 만들어서 사용을 했는데요, 오늘 하위 버전인 SQL2000 에서는 해당 함수가 생성되지 않는다는 이야길 듣고, 어쩌나... 수정을 했습니다. 중요한 건, 일단 (사용자정의)함수 내에서는 비확정적 시스템 함수를 사용할 수 없다. 라는 것이 핵심입니다. 가만 보니까, SQL2005 에서는 제가 만든 함수 내에서도 GETDATE() 가 먹는데요, 저희가 만드는 DB 관련 프로그램이 워낙 여기저기 팔려나가는 거라서, SQL2000 의 호환에도 신경을 좀 써야 하거든요.

오류나는 함수 생성 코드
  1. CREATE FUNCTION DBO.UDF_TEST_GETDATE
  2. ()
  3. RETURNS NVARCHAR(8)
  4. AS
  5. BEGIN
  6.   DECLARE @TODAY NVARCHAR(8)
  7.  
  8.   SET @TODAY = CONVERT(NVARCHAR, GETDATE(), 112)
  9.  
  10.   RETURN @TODAY
  11. END
  12. GO
  13.  
  14. SELECT DBO.UDF_TEST_GETDATE() AS TODAY
  15. GO
이런 멋진 에러가 납니다.
메시지 443, 수준 16, 상태 1, 프로시저 UDF_TEST_GETDATE, 줄 8
함수에서 'getdate' 사용이 잘못되었습니다.

참고 : SQLER Friend 강좌 - 사용자 정의 함수에 대해서(2)

저기 참고 글에서는 파라메타로 오늘 날짜를 받는 것으로 해결하는 것이 좋다. 라고 되어 있습니다만, 문제는, 이게 이미 나가있는 것이기 때문에 기존에 만든 함수의 파라메타를 함부로 건드릴 수 없다는 겁니다. 고민고민고민 하다가, 오라클 등에서는 오늘날짜 같은 건 테이블 형태로 관리되니까 좋을텐데.... 하는 생각에 현재 날짜를 갖고 있는 테이블이 무엇일까하고 몇 초간 고민하다가, 우리 프로그램의 로그인이 Master 권한임을 생각해 내고는, 이렇게 바꾸어 봤습니다.
(으잉? 써 놓고 가만히 읽어보니 "프로그램의 로그인이 Master 권한임을.." 이건 뭔 소리?? 한국말, 제대로 쓰기 어렵습니다.)
  1. CREATE FUNCTION DBO.UDF_TEST_GETDATE_SQL2000_COMPATIBLE
  2. ()
  3. RETURNS NVARCHAR(8)
  4. AS
  5. BEGIN
  6.   DECLARE @TODAY NVARCHAR(8)
  7.  
  8.   SELECT @TODAY = CONVERT(NVARCHAR, MAX(LAST_BATCH), 112)
  9.     FROM MASTER..SYSPROCESSES
  10.  
  11.   RETURN @TODAY
  12. END
  13. GO
  14.  
  15. SELECT DBO.UDF_TEST_GETDATE_SQL2000_COMPATIBLE() AS TODAY
  16. GO
히...  결과가 제대로 나옵니다. MASTER..SYSPROCESSES 라는 테이블은, 현재 접속하고 있는 클라이언트들의 정보를 보여주는 시스템 테이블입니다. LOGIN_TIME, LAST_BATCH 라는 시간관련 컬럼이 있어서 그를 이용했습니다. (현재 접속 클라이언트의 맥어드레스도 알 수 있습니다.)

우선은, 호환성을 위해선, 파라메타로 받는 것이 좋겠죠.
그냥, 이런 땜빵도 있다는 거.. 참, 이 예제는 M$SQL 에서만 적용되는 겁니다.. 응.

이거 꽤 이슈인 듯.
How do I use GETDATE() within a User-Defined Function (UDF)?

'Coders' 카테고리의 다른 글

[MSSQL] ROLLUP 을 이용한 소계/총계 - GROUPING 함수  (4) 2009.02.19
공장 기계  (4) 2009.01.09
[C#] 문자열에서 HTML 태그 지우는 방법  (0) 2008.11.13