MS-SQL을 97버전부터 쭉... 15년 이상 써왔습니다. 그런데 SQL 2012에 들어서 이상한 점이 발견되서 문의드립니다.
일련의 순서를 저장하기 위해 #으로 정의하는 임시테이블을 사용합니다.
물론, 오라클을 따라서 Rank라는 함수가 있으나 문제는 이 함수가 2000에는 없어서..(거래처중 아직도 2000이 있답니다..)
여튼, rank와 같은 짓을 하기 위해 저는 임시테이블을 사용했습니다.
예를 들어 다음과 같은 데이터(A테이블)가 있습니다.
DAT SEQ
------------------
104
103
101
102
105
일련번호에 데이터의 순서에 맞게 값을 넣고자 합니다. 잘 되면 다음과 같이 됩니다.
DAT SEQ
------------------
104 4
103 3
101 1
102 2
105 5
그야말로 순서를 매기는 거죠. 그런데 위에서 말씀드렸다시피 거래처중 2000이 있다보니 rank를 쓰지 못합니다.(썼다가 대박난 적이 있..) 그래서 다음과 같이 작업합니다.
SELECT 데이터 INTO #T FROM A ORDER BY DAT
이렇게 되면 #T에는 다음과 같은 자료가 만들어져야 합니다.
DAT
---------
101
102
103
104
105
이제 여기에 뭐 몇가지 작업을 더해서 일련번호를 부여하고, 그다음에 원천 자료와 매칭해서 업데이트를 해왔습니다.
그런데.. 2012에 와서(그런데 모든 2012가 다그러는지는 미처 확인 못했습니다) 이 #T에 insert할때 이상하게 저장됩니다. 분명, ORDER BY를 주었음에도 데이터가 몇개씩 순서가 틀어지는 겁니다.
이건 그냥 임시테이블이 만들어져 있는 상태에서 SELECT * FROM #T를 해보면 알수 있습니다.
2012미만 버전과 2012버전이 서로 다른 결과 값을 보여주는거죠.
그런데 문제는 2012에서 결과를 예전처럼 만드는 방법이 없다는 겁니다.(뭐.. 제가 모르는거겠지요..?)
뭔가 옵션이 있을거 같기도 한데요... 왜냐하면 다른 2012를 사용하는 다른 거래처는 별말이 없었거든요..
설이 길었습니다만.. 혹시 2012에서 이런 요상한 상황 보신적이 있으신가요???
물론, 일단은 해결해야해서 SQL의 버전을 체크해서 2012인 경우에는.. 해서 함수를 따로 만들어서 RANK로 돌렸습니다. 그래도 뭔가 찜찜해서요..
해결책이 있다면.. 알려주셨으면 합니다.
고맙습니다.
Comment 3
-
건우아빠
2015.05.19 09:39
-
처리짱
2015.05.19 10:54
SELECT 데이터 INTO #T FROM A ORDER BY DAT 이런식으로 하니 ORDER BY가 제대로 안먹히더라고요
INSERT #T SELECT 데이터 FROM A ORDER BY DAT
이런식으로 하셔야 할듯요.
-
비와바람
2015.05.19 14:44
건우아빠//
원래 목적이 건우아빠님이 말씀하신대로입니다. 임시테이블에 insert하고 identity를 추가해서 순서를 잡은 다음, 그 값을 원천 DB에 조인해서 대입하는 거였죠. 근데 그게 안되서 문제인거죠..
처리짱//
쓰진 않았지만 그렇게도 해봤습니다. 이미 다 select 시킨다음 다시 insert도 해봤는데.. 이것도 마찬가지더군요. ㅠㅠ
임시테이블에 IDENTITY 컬럼을 추가하신 다음 해 보세요.. 어떻게 들어가는지 ...