728x90
select replace(convert(varchar,convert(money, 1000000 ),1),'.00',space(0) ) as total

 

 

728x90
728x90

sp_columns @table_name='테이블명'

728x90
728x90

특정 테이블 필드에서 공통된 문자열을 기준으로 오른쪽 값만 표시 할 일이 생겨.

삽질 끝에 완성했다.

 

실제데이터

Name

============================

urn:upc:tmkim@domain.com

urn:confs:testh005@domain.com

urn:confs:testkp002@domain.com
urn:hcd:testkp002@domain.com
urn:confs:testkp007@domain.com

urn:hcd:testkp007@domain.com

 

자 시작해보자

 

 

실행 쿼리

select Right(D.Name,LEN(D.Name)-CHARINDEX(':t',D.Name)) As PName from Document

 

결과 값

Name

============================

tmkim@domain.com
testh005@domain.com
testkp002@domain.com
testkp002@domain.com
testkp007@domain.com
testkp007@domain.com

 

해설

Name 값의 "총 문장길이값"를 ":t"까지의 길이 뺀 후 숫자만큼 뒤에서 부터 출력하여 빼도록 하였다.

왜냐면 메일주소의 길이가 가변적이때문에 공통된 :t까지를 기준으로 잡았다.

 

끝.

728x90
728x90

MSSQL 현재 데이터베이스에 접속중인 세션정보 / 아이피 확인방법

 

   SELECT P.spidP.login_timeP.last_batchP.statusP.program_nameP.cmdC.client_net_address

   FROM sys.sysprocesses AS INNER JOIN sys.dm_exec_connections AS C

   ON P.spid C.session_id

 

 - sys.sysprocesses

 

​   SQL Server 인스턴스에서 실행 중인 프로세스에 대한 정보를 표시하는 뷰입니다.

 

 - sys.sysprocesses에서 참조한 컬럼 안내

컬럼

속성

 spid

 SQL Server 세션 아이디

 loginame

 로그인 이름

 login_time

 클라이언트 프로세스가 서버에 로그인한 시간

 last_batch

 클라이언트 프로세스가 원격 저장 프로시저 호출 또는 EXECUTE 문을 마지막으로 실행한 시간

 status

 프로세스 아이디 상태

  

   - status가 갖을 수 있는 값

  dormant = SQL Server에서 세션을 다시 설정하는 상태

  running = 세션에서 일괄 처리를 하나 이상 실행하는 상태

  background = 세션에서 백그라운드 태스크를 실행하는 상태

  rollback = 세션에서 트랜잭션 롤백을 진행하는 상태

  pending = 세션이 작업자 스레드를 사용할 수 있을 때까지 기다리는 상태

  runnable = 세션이 실행중인 상태

  sleeping = 세션이 작업을 기다리고 있는 상태

  spinloop = 세션이 스핀락에 걸려 있는 상태

  suspended = 세션이 이벤트가 발생할 때까지 대기하고 있는 상태

 program_name

 응용 프로그램의 이름

 cmd

 현재 실행 중인 명령

 

 - sys.dm_exec_connections

 

​   SQL Server 인스턴스에 대해 설정된 연결에 대한 정보와 각 연결에 대한 세부 정보를 표시하는 뷰입니다.


 - sys.dm_exec_connections 에서 참조한 컬럼 안내

컬럼

속성

 session_id

 SQL Server 세션 아이디

 client_net_address 

 서버에 연결된 클라이언트의 호스트 주소 (아이피)

 

[참고사항] 접속중인 세션정보를 확인하기 위해 sys.sysprocesses와 sys.dm_exec_connections를 조인하는 이유

 

​   sys.sysprocesses는 SQL Server 인스턴스에서 실행 중인 프로세스에 대한 정보를 표시하기 때문에 현재 접속중인 세션정보를

   확인하기 위해 반듯이 필요하나 클라이언트 프로세스와 시스템 프로세스 모두를 포함하고 있습니다.

   때문에 클라이언트 프로세스만을 갖고 있는 sys.dm_exec_connections를 조인하여 클라이언트 프로세스의 접속정보를 표시할 수

   있도록 만들어주어야 합니다.

 

 - 예제

 

   현재 접속중인 세션아이디, 로그인시간, 마지막 실행시간, 아이피를 표시하시오.

 

 

 - 예제 쿼리 실행

 

   SELECT P.spidP.login_timeP.last_batchC.client_net_address

   FROM sys.sysprocesses AS INNER JOIN sys.dm_exec_connections AS C

   ON P.spid C.session_id

 

 

spid

login_time

last_batch

client_net_address

 51

 2014-10-14 20:54:36.297

 2014-10-14 20:59:32.827

 <local machine>

 52

 2014-10-14 21:39:32.043

 2014-10-14 21:55:35.810

 <local machine>

 53

 2014-10-14 21:48:30.920

 2014-10-14 21:49:08.467

 192.168.1.2

728x90
728x90

 

MSSQL Linked Server

Link  - http://blog.naver.com/lovzip/20056016860

728x90
728x90
 

New-NetFirewallRule -DisplayName "MSSQL BROWSER UDP" -Direction Inbound -LocalPort 1434 -Protocol UDP -Action Allow

New-NetFirewallRule -DisplayName "MSSQL ENGINE TCP" -Direction Inbound -LocalPort 1433-1434 -Protocol TCP -Action Allow

New-NetFirewallRule -DisplayName "MSSQL AOAG EP TCP" -Direction Inbound -LocalPort 5022 -Protocol TCP -Action Allow

netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes

 

728x90
728x90

DB에서 컬럼 이름 찾기

배경

어떤 데이터를 DB에서 직접 고치게 되면, 늘 걱정하는 것 중 하나가 완벽하게 모든 영향받는 테이블들까지

잘 고쳤는가 하고 스스로에게 물어보는 것일게다.

그럴 때면, 해당 컬럼 이름이 포함된 모든 테이블을 뒤지는 게 상책이다.

 

소스

select b.name, a.name 
from sys.all_columns a, sys.all_objects b
where a.object_id = b.object_id and b.type_desc = 'USER_TABLE'
and a.name = 'AccountID' --// 해당 컬럼 이름을 여기에 넣어서 찾으면 된다.


 

잡담

sys.all_objects 는 참 유용한 녀석이다. 테이블 뿐만 다음과 같은 타입을 모두 취급하니,

시간되면 천천히 찾아 볼 일이다. ㅎㅎ

 

 

CLR_STORED_PROCEDURE
SYSTEM_TABLE
VIEW
SQL_TABLE_VALUED_FUNCTION
DEFAULT_CONSTRAINT
SQL_STORED_PROCEDURE
EXTENDED_STORED_PROCEDURE
AGGREGATE_FUNCTION
USER_TABLE
SERVICE_QUEUE
SQL_INLINE_TABLE_VALUED_FUNCTION
INTERNAL_TABLE
CLR_SCALAR_FUNCTION
SQL_SCALAR_FUNCTION
PRIMARY_KEY_CONSTRAINT

 

출처 : http://blog.daum.net/nextkey/122

728x90
728x90

쿼리 처리 과정 / SELECT 실행순서

쿼리가 처리되는 과정은 다음과 같다.

 

1. 구문 분석(Parsing)

해당 쿼리가 문법적으로 틀리지 않은지 확인. 해당 구문을 SQL 서버가 이해할 수 있는 단위들로 분해하는 과정.

만약 구문이 부정확하다면 여기서 처리를 중단. 이 문장이 일괄 처리(batch) 내에 있다면 일괄 처리 전체를 중단.(Batch abort : Batch 중 하나라도 systax error가 있다면 전체 batch가 실행되지 않는다.)

2. 표준화(Standardization)

실제로 필요없는 부분들이 제거. 표준화된 쿼리 트리(Standard Query Tree)가 만들어 진다.

3. 최적화(Optimization)

통계나 조각 정보 등을 바탕으로 실행 계획을 만들어 낸다. 쿼리처리에서 매우 중요한 단계

① 쿼리 분석 : 검색 제한자(SARG)인지 조인 조건인지 판단.

② 인덱스 선택 : 분포 통계 정보를 이용하여 인덱스검색이나 테이블 스캔 중의 하나를 선택. 여러 인덱스 중 가장 효율적인 인덱스를 선택

③ 조인 처리 : JOIN, UNION, GROUP BY, ORDER BY 절을 가지고 있는지 확인하여 적절한 작업 순서를 선택

이 단계의 출력은 실행 계획(Execution Plan) 이다.

4. 컴파일(Compilation)

컴파일을 하면 이진 코드가 생성된다. 일반적인 경우에는 컴파일하고 나면 .exe, .dll 등의 이진 파일이 만들어 지는데, SQL Server에서는 그냥 메모리(프로시저 캐시)에만 올린다. 그래서 컴파일 속도가 매우 빠르다.

5. 실행(Execute)

엑세스 루틴으로 가서 실제 처리를 하고 결과를 돌려준다.

 

이상의 다섯 단계는 단순화한 논리적 절차로 받아들여야 하며, 실제 쿼리 과정은 이보다 훨씬 더 복잡하다.

 

 


 

SELECT 실행 순서 

 

-문법 순서-

 

SELECT                            - 1

FROM                               - 2

WHERE                             - 3

GROUP BY                        - 4

HAVING                            - 5

ORDER BY                        - 6

 

-실행 순서-

 

FROM                               - 1

WHERE                             - 2

GROUP BY                        - 3

HAVING                             - 4

SELECT                            - 5

ORDER BY                         - 6

 

 

해당 데이터가 있는 곳을 찾아가서                   (FROM)

조건에 맞는 데이터만 가져와서                       (WHERE)

원하는 데이터로 가공                                    (GROUP BY)

가공한 데이터에서 조건에 맞는 것만                (HAVING)

뽑아내서                                                     (SELECT)

정렬                                                           (ORDER BY)

 

실행순서는 문법, 권한 검사 순서이기도 하고,

Alias 등록 순서 이기도 하다.

 

별칭(Alias)

FROM 절에서 테이블에 Alias를 사용했다면       (FROM Table1 AS T1)

SELECT, ORDER BY 절에서 사용할 수 있고      (SELECT T1.Col1, ORDER BY T1.Col1)

SELECT 절에서 컬럼에 Alias를 사용했다면       (SELECT T1.Col1 AS a)

ORDER BY 절에서 사용할 수 있다.                   (ORDER BY AS a)

 

ORDER BY절에 T1.a가 안되는 것으로 보아

aT1.col1을 대신하는 것 같다.

728x90
728x90

MS-SQL 서비스를 운영하다보면, 특정 쿼리의 Lock 문제로 리소스 낭비 뿐만 아니라 최악에는 서비스까지 영향을 미치는 문제가 발생하는 경우가 있다. 이런 문제가 발생하게 되면 보통 별도의 알람 시스템을 통해 알람을 전달 받고 해당  Lock을 발생하는 SPID를 확인해서 빠르게 Kill 해주는게 좋다.

쿼리창에서 아래 그림의 명령어를 입력해서 현재의 Lock 상태를 확인 합니다.
해당 정보를 이용해서 Lock의 종류를 분류하고 장애를 처리 할 수 있습니다.

 

  • S : 공유 잠금 Lock.
  • U : 업데이트 잠금 Lock.
  • X : 독점 잠금 Lock.
  • IS : 의도 공유 잠금 Lock.
  • IU : 의도 업데이트 잠금 Lock.
  • IX : 독점 의도 잠금 Lock.
  • BU : 대량 업데이트 잠금 Lock.
DBCC Inputbuffer (SPID 번호) 명령을 실행하여 Lock을 발생시킨 원인 쿼리를 확인 합니다.
Lock을 발생시킨 쿼리문이 확인 되었다면, Kill 명령을 통해 해당 작업을 중지 하면 됩니다.

  • Kill(SPID 번호)

 

동일한 문제가 발생할 가능성이 높기 때문에, 아래 명령어를 통해 SPID 확인 및 해당 SPID의 소유자를 먼저 확인 합니다.

  • EXEC SP_WHO
  • EXEC SP_WHO spid

다음으로 어떤 쿼리가 실행 되었는지를 확인 합니다. (아래 명령어 참고)

  • DBCC INPUTBUFFER(spid)

 

위와 같이 수동으로 작업하는 방법 이외에, 스케줄러를 통해 자동 처리하는 방법이 있지만, 혹시 모를 장애를 대비해서 관리자가 직접 해당 쿼리문등을 확인하고 작업하는 걸 추천 드립니다.

728x90

+ Recent posts