mssql에서 한글이 포함된 문자열의 바이트수를 구하기

어제 저희 사무실에 동료직원이 크리스탈리포트 보고서에 주소를 찍는데 뭐가 잘 안된다고 요청을 하더군요.

일반적으로 주소컬럼은 주소, 세부주소 이렇게 둘로 나뉘어 있는데, 그 업체는 그걸 몰아서 전부 앞에다 집어 넣었더군요.

그래서 한 컬럼으로 출력으로 하는데.

주소길이가 길면 줄바꿈이 일어나서 두줄에 출력되고, 짧으면 한줄로만 출력이 되는 거였습니다.

그런데 크리스탈리포트는 세로로 정렬하는 옵션이 없지요.

따라서 길이가 짧은 주소는 위로 붙어보이게 됩니다.

근데 거래처에서 길이가 짧은 주소는 세로로 중간에 나오게 해달라고 요청을 했었나 봅니다.


결국 주소컬럼 두개를 화면에 놓고(하나는 원래대로 위쪽에, 다른 하나는 중간), supress옵션에  주소의 길이에 따라 숨기는 옵션을 주었습니다.

그럼 길이가 긴 주소는 위쪽의 주소가 출력이 되고, 짧은건 중간것이 출력이 되겠지요.


그런데 크리스탈리포트의 함수에 아무리 찾아봐도 유니코드 관련 처리부분이 없더군요.

주소라는게 한글과 영문 숫자들이 들어가기 때문에 유니코드로 길이가 계산이 되면 길이가 틀려지니까요.


mssql에는 있나 확인해 보니 있더군요.

select len('가나다abc123')

select datalength('가나다abc123')

결과는 9, 12입니다.


한글이 포함된 경우 바이트수를 알려면 datalength이 정답~


by changwoo | 2009/11/18 13:43 | mssql | 트랙백 | 덧글(0)

나영이 사건 관련하여

처음에 관련 내용을 인터넷에서 접했을 때

그 범행수법 등을 읽어보고 구토할 뻔 했습니다.

어제 티비에서

녹화가 안됐네, 소리가 작네 등등의 이유로

그 어린 애새끼를 다섯번이나 불러서 괴롭힌 검찰의 행태를 보았습니다.

안산시는 600만원의 지원금을 주고 다시 빼았아갔다는군요.

저 왠만해서는 어디에 리플달거나 그러지 않는데

안산시 홈피에 가서 실명 확인하고 실컷 욕하고 왔습니다.

이 나라는 도저히 희망이 없군요...





by changwoo | 2009/10/14 12:20 | 일상 | 트랙백 | 덧글(0)

무등산에 갔다가 특이한 나무를 봤습니다.

주말에 무등산에 갔다가 특이한 나무를 봤습니다.

무등산 산장쪽에서 조금만 올라가면 늦재라고 있는데 거기서 약 50미터 정도 걸어가면 이 나무가 있네요.

정확히 하트 모양으로 구멍이 나 있는게...

이걸 옹이라고 하나요?

어쨌거나 꼭 누군가가 일부러 만들어 놓은 것처럼 말이죠.

옆에는 그 근처에서 본 예쁜 버섯입니다.

by changwoo | 2009/09/07 17:36 | 일상 | 트랙백 | 덧글(0)

국가대표에서 제일 웃겼던 부분

국가대표...

크게 기대는 안하고 걍 예매율, 평점 등이 높길래 봤습니다.

근데 재밌더군요. 감동적이기도 하고...

요즘엔 한국영화 보고도 전혀 돈이 아깝지 않다는 생각이 듭니다.

그나저나 국대에서 제일 웃겼던 부분은...

이 친구들 비행기 타고 미국(?)가는데, 주인공 팔을 걷었더니 빨간 반점들이...

코치가 너 혹시 옥장판 깔고 잤니?하고 묻고

다음 이어지는 창문에 박치기 ㅋㅋㅋ

전 이부분이 제일 재밌었습니다.



by changwoo | 2009/09/07 16:59 | 일상 | 트랙백 | 덧글(0)

ms-sql 맥어드레스

클라이언트에서 별도로 api를 사용할 필요가 없이, ms-sql에서는 맥어드레스가 걍 바로 나오는군요.
sysprocesses테이블에 net_Address가 그것입니다.

select * from master.dbo.sysprocesses해보면
net_Address란 컬럼이 리턴되는데
그게 맥어드레스입니다.
물론 리턴되는 값은 사이사이에 하이픈이 없이
00130288FFB7
요런 형식으로 리턴됩니다.

걍 디비단에서 중복로그인을 체크하려면 이렇게 하시면 됩니다.


  1 select @netAddress=net_address

  2 from master.dbo.sysprocesses

  3 where spid=@@spid

  4

  5 if exists(select *

  6           from master.dbo.sysdatabases d

  7           inner join master.dbo.sysprocesses p on d.dbid=p.dbid

  8           inner join dbo.users u on p.net_Address=u.macAddress

  9           where d.name=db_name()

 10             and p.net_address<>@netAddress

 11             and u.userID=@userID) begin

 12     raiserror('이미 다른 곳에서 접속중인 아이디입니다.', 16, 1)

 13     return

 14 end



전체 코드는 여기에 있습니다.

by changwoo | 2009/08/23 00:05 | mssql | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶