달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

MSSQL 을 사용하다가 보면 아래와 같은 데이터를 만날 수 있다.

RegDate        Code    Count
2011-01-27      AU      55
2011-01-27      BE      1
2011-01-27      BR      2
2011-01-27      CA      22
2011-01-27      CH      2
2011-01-27      CN      150
2011-01-27      DE      20
2011-01-27      ES      30
2011-01-27      FR      4
2011-01-27      GB      59
2011-01-27      Han     1
2011-01-27      HK      81
2011-01-27      HU      1
2011-01-27      IE       2


대충 위와 같이 특정 일에 어느 코드로(국가코드) 몇건의 접속이 있었나 로그를 남긴것이다..
하지만 나는 이걸 가로로 나열하고 싶었다...
그래서 찾아낸것이 PIVOT..

RegDate        KR   US   JP   CN
2011-01-27    262   290   97   150

좀 데이터가 많아서 4개 국가코드만 빼내어 봤다..

이걸 가능하게 하는 코드 PIVOT을 보자

우선 첫번째 소스의 경우
SELECT RegDate, Code, Count(*) as Cnt From [TABLE]
GROUP BY RegDate, Code
인 상태라.. 날짜 + 코드로 GROUP BY 를 사용하고 각각의 Cnt 를 뽑았다.

이걸 PIVOT을 회전시키려면
SELECT RegDate, KR, US, JP, CN   FROM   -- (내가 뽑아낼 데이터 필드의 value값을 적어주면 된다)
     ( SELECT RegDate, Code, Count(*) as Cnt From [TABLE] GROUP BY RegDate, Code ) A
PIVOT
( Sum(Cnt) FOR Code in (KR, US, JP, CN) ) PV  -- Code필드의 Value가  KR, US, JP, CN 인 것들의 각각의  합계값을 출력 하라는 거죠.

이와 같이 하면 옆으로 돌아간 데이터가 나옵니다.
 물론 각 필드를 더 추가하면 더 많은 필드를 빼올 수도 있습니다.


Posted by SadDev
|
DB에서 정보를 검색해야 되는데 이상하게 검색이 안된다..
DB가 char(n) 타입이라 데이터 뒤에 공백이 붙는다.

예를들어 'aaaa' 라는 데이터를 넣으면 'aaaa           ' 라는 형식으로 입력이 된다.(char 니까 당연...)
하지만 검색할때는 'aaaa', 'aaaa ', 'aaaa     '... 다 되는게 정상이다...
그런데 이상하게 검색이 안되는 넘이 있었다...

문제의 발단은 txt 파일에서 정보를 읽어서 자동으로 인서트 시키는 기능이 있었는데 이 txt 파일에 aaaa 뒤에 탭 문자가 들어가 있었다.
실제로 메모장으로 열어서 커서를 이동해 보면 탭 문자 간격만큼 이동한다..

이거 때문에 삽질 하다가 수정한 결과를 적어 본다.

우선 MSSQL 에서 Tab 문자는  CHAR(9) 다.
줄바꿈 문자는 CHAR(10) 혹은 CHAR(10)+CHAR(13) ...

UPDATE [TABLE] SET value = REPLACE(value, CHAR(9), '')   하면 해결..
여기서CHAR(9) 는 문자열이 아니므로 'CHAR(9)' 로 적으면 안댄다.

어쨋든 이렇게 한건 해결...
Posted by SadDev
|
MSSQL 2005, 2008은 데이터 베이스에서 바로 메일 발송이 가능하더라..
2000때는 프로시져 만들고 머하고 복잡하게 하는걸 본적이 있었는데 승리의 MS!!!

어쨋든 간단히 설명해 본다.


1. SQL SMS 를 열어 서버에 접속 한다.
2. 관리 -> 데이터베이스 메일을 오른클릭 -> 데이터베이스 메일 구성 으로 들어갑니다.




3. 메일 구성 마법사 시작이 나오면 그냥 다음을 누르던가 이후에 페이지 표시 안함 체크하고 어쨋든 다음!!



4. 구성 태스크 -> 다음 태스크를 수행하여 데이터베이스 메일 설치 선택


5. 아래와 같은 창이 나올 경우 "예" 를 눌러 줍니다.


6. 새 프로필 구성
 - 프로필 이름은 이후 프로시져 호출에 사용되므로 기억하기 쉽게 작성 하자(좀더 짧게 할걸 ㅡㅡ;)
 - 설명은 알아서 적자
 - SMTP 계정에 추가 를 눌러 새로운 계정을 추가 하자



7.  계정 이름 설명은 알아서 적으시면 됩니다.
 - 전자 메일 주소 : 보내는 사람의 메일 주소
 - 표시 이름 : 메일 확인 시 표시 되는 이름
 - 회신 전자 메일  : 회신을 할 경우 이 메일 주소로 갑니다. 
 - 서버 이름 : 메일 서버 이름
  인증 방법은 기본 인증을 선택한 후  위에 입력한 메일주소의 계정과 비밀번호를 입력합니다.
  그리고 확인 -> 확인




8. 새로운 프로필이 생성 되어 있는걸 확인 할 수 있습니다.
 - 기본프로필을  예로 할경우 아마 프로시져 호출에서 프로필 이름을 Null로 사용이 가능하다고 생각합니다.
 (메일 발송 프로시져에 Null일 경우에 대한 처리가 있더군요)



9. 설정 할 부분이 있으면 설정 하고 넘어 갑니다.



10. 자신의 설정 내용을 확인 합니다.




11. 구성 작업이 진행 됩니다.



12.  쿼리창을 띄우고 아래와 같이 입력 해봤습니다.
USE msdb
GO
EXEC sp_send_dbmail @profile_name='Database_SendMail',
@recipients=bbb@mail.co.kr',
@subject='메일 발송 테스트',
@body='이 메일은
테스트 메일 입니다.
받고
그냥 지워 버리세요'

sp_send_mail은 시스템 테이블 중 msdb에 있습니다. 그러므로 use msdb 해주세요
@Profile_name 은 처음에 작성한 프로필의 이름입니다.  기본 프로필을 예로 할경우 필요 없는 것 같네요
@recipients 는 받는 사람 메일 주소입니다.
@subject 는 메일제목 입니다.
@body는 메일 내용입니다.




13.  위와 같이 발송해서 받은 메일 주소입니다.
쿼리에서 텍스트는 줄바꿔서 적으면 동일하게 적용됩니다.

Posted by SadDev
|
MSSQL 2008에서 백업한 백업 파일을 하위 버젼인 2005나 2000에서 복원을 시도 하면 오류가 난다.
하지만 복원 하는 방법이 있어서 소개 한다.


참고 사이트 http://www.linglom.com/2009/08/14/restore-database-from-sql-server-2008-to-sql-server-2005-part-2-generate-sql-server-scripts-wizard/
이거 보고 따라 해서 성공했음..

영문이라.. 그냥 한글로 다시 정리 하는 기분으로 작성합니다~

1. SQL 2008 에서 백업을 할 데이터 베이스를 선택 후 오른클릭-> 태스크 -> 스크립트 생성 을 선택 합니다.

2. 스크립트 마법사가 나오면 다음을 눌러 넘어갑니다.


3. 백업할 데이터 베이스를 선택 한 후 하단의 " 선택한 데이터베이스의 모든 개체 스크립팅" 에 체크 합니다.


4. 스크립트 옵션 선택에서  서버버젼에 대한 스크립트 = SQL Server 2005 선택  , 데이터베이스 생성 스크립팅 은 False

5. 테이블 / 뷰 옵션에서 데이터 스크립팅 을 True 로 바꿔 줍니다.

6. 출력 옵션에서 "파일로 스크립팅" 을 선택합니다.


7. 스크립트 생성 진행률이 표시되며 완료 되면 닫기를 누르고 완료 합니다.

8. 복원할 서버에 새 데이터 베이스를 생성합니다.

9. 새로 생성한 데이터 베이스의 쿼리 분석창에 위에성 생성시킨 sql 스크립트파일을 불러와서 실행 시키면 복원 완료..



의외로 간단하게 끝나네요..
Posted by SadDev
|

데이터 베이스 목록을 가져오는 쿼리

SELECT dtb.name AS [Name] FROM master.sys.databases

Posted by SadDev
|
select col.name, col.column_id, st.name as DT_name, col.max_length, col.is_nullable, col.is_identity, defCst.definition 
from sys.columns col left outer join sys.types st on st.user_type_id = col.user_type_id 
left outer join sys.default_constraints defCst on defCst.parent_object_id = col.object_id and defCst.parent_column_id = col.column_id 
where col.object_id = object_id(N'dbo.Music') order by col.column_id
아래 이미지는 실행 결과..

컬럼의 이름, 아이디, 형식 , 크기, null, identity, 기본 값 이 나온다. (원래는 더 많은 정보가 나오지만 필요한것만 나오도록 엄청 많이 삭제....)

Posted by SadDev
|