SQL 에서 SELECT 혹은 EXEC 와 같이 조회나 프로시저 실행 시 락에 걸려 우너하는 결과를 얻지 못하는 경우가 발생한다. 이때 락 걸린 프로세스를 종료하는 방법이다. 1. SP_LOCK & SP_WHO2 현재 락 걸린 세션 ID를 확인할 수 있도록 SP_LOCK를 제공합니다. 또 다른 함수로는 SP_WHO2 도 제공됩니다. EXEC SP_LOCK EXEC SP_WHO2 실행하면 위와 같은 결과가 나오는데 Mode 컬럼에 X 인 경우가 현재 락이 걸린 세션입니다. BlkBy 컬럼에 값이 있다면 락이 걸린 세션입니다. 락이 걸린 세션을 확인했다면 해당 세션ID (SPID) 를 확인하여 해당 세션을 종료시켜주면 됩니다. KILL (SPID) 다시 조회하면 락이 풀린 것을 확인할 수 있습니다. http..
sys.object 를 검색하다가 예제에 유용해 보이고 현재 개발하고 있는 부분을 테스트 서버에서 실서버로 적용하기 위해서도 필요할 것 같아 포스팅 하기로 마음먹었다. 최근 수정된 프로시저 및 모든 개체를 검색하는 예제 SELECT name AS object_name ,SCHEMA_NAME(schema_id) AS schema_name ,type_desc ,create_date ,modify_date FROM sys.objects WHERE modify_date > GETDATE() - -- n_days 부분에 최근 며칠이내의 수정내역을 보고 싶은지 검색하면 된다 ORDER BY modify_date; 조회해보면 조건에 해당하는 개채들을 조회할 수 있으며, 순서대로 명 / 스키마 / Type / 생성일자..
프로시저 내부의 문자열을 검색하는 방법은 과거 포스팅도 했듯 sys.syscomments로 간단하게 할 수 있다. https://kaiaphas.tistory.com/55 [MS-SQL] 프로시저 문자열 검색 수 많은 프로시저들 중에서 테이블이나 프로시저를 검색할 때 사용하는 SELECT 문이다. 이것말고도 몇가지 방법이 더 있긴 한데... 그냥 이게 가장 간단해서 애용하는 방법이다. SELECT DISTINCT OBJECT_N kaiaphas.tistory.com 하지만... 그렇다고 한다. 뭐 어쨌든 기능이 삭제되니 아래 sql_modules 로 변경하라는 뜻 같다. 하여 아래 내용으로 다시 포스팅 한다. 문자열 검색 SELECT sm.object_id , OBJECT_NAME(sm.object_id..
CHARINDEX() 함수는 두 번째 문자 내에서 첫 번째 제공된 문자를 찾아 위치를 반환한다. CHARINDEX charindex( expressionToFind , expressionToSearch [ , start_location ]) return int; CHARINDEX 를 이용하여 문자열 자르기 declare @t1 table ( idx int identity (1,1) not null, itemname varchar(30) ) -- t1 테이블 생성 insert into @t1 values ('안녕하세요#안녕하세요') insert into @t1 values ('반갑#습니다') -- t1 테이블에 데이터 입력 select charindex('#',itemname) as idx, left(it..
업체 요청사항으로 현재 가지고 있는 Roll 수를 하나의 행으로 표현해달라는 요청을 받았다. 위 부분을 검색하며 짠 부분을 포스팅 한다. Declare @T1 Table ( idx int identity (1,1) not null, item_name varchar(20), item_num int ) -- T1 테이블 생성 -- T1 테이블이 기본이 되는 테이블이다. Declare @T2 Table ( idx int identity (1,1) not null, item_name varchar(20), item_num int ) -- T1에 있는 수량만큼 ROW로 추가할 테이블이 T2 Insert into @T1 values ('book', 2) Insert into @T1 values ('note', 3)..
피벗 테이블 사용 방법 SELECT * FROM ( SELECT [각컬럼] FROM [테이블명] ) A PIVOT ( SUM([집계할컬럼]) FOR [대상이될컬럼] IN ([PIVOT시컬럼이될밸류값]) ) AS [피벗테이블이름] 위는 피벗테이블을 사용하는 방법이다. 예로 아래와 같은 테이블이 존재한다면 GUBUN CONDATE MONEYCODE BASEREATE XXX 99 201601 002 1000 --- 99 201602 002 1024 --- 아래와 같은 피벗을 이용하여 날짜를 컬럼으로 가공하는 것이 가능하다. SELECT * FROM ( SELECT RIGHT(CONDATE,2) AS CONDATE, BASERATE FROM PL.MONEYRATE WHERE MONEYCODE = '002' ) ..
가끔 데이터 이관(마이그레이션) 작업을 하다보면 키값을 다시 매겨야 하는 순간이 온다. 그때 사용하는 방법 중 하나. 번호를 다시 매기는 방법인데, row_number()를 사용하면 간단하게 순차적으로 번호를 뽑아올 수 있다. SELECT KEY, ROW_NUMBER() OVER(PARTITION BY KEY ORDER BY KEY) FROM TABLE -- 또 다른 방법은 SELECT KEY, RIGHT('000'+CAST(ROW_NUMBER() OVER(PARTITION BY [KEY] ORDER BY [KEY])) AS VARCHAR(3)),3) FROM TABLE 이런 식으로 사용해주자. PARTITION 부분은 KEY를 기준으로 ROW_NUMBER를 채번하는 것으로 같은 KEY를 묶어 채번이 된..