SELECT * FROM v$resource_limit;
오라클에서 현재 세션 수 확인
SQL Server Management Studio(SSMS)의 여러 버전 중 정확히 버전인지는 기억이 나지 않는다. 2005는 되는 걸로 기억하고... 개체 탐색기를 통해서 SP를 찾아보려하는데 숫자가 너무 많아서 아예 에러메시지를 뱉으며 표시가 안되는 경우가 있었다. 우선 개체탐색기 정보 탭에서는 탐색이 가능해서 그걸로 확인했다.
이래저래 귀찮으니 그냥 시스템SP의 도움을 받아 쿼리로 직접 SP의 내용을 까보자.
sp_helptext @objname='찾고자하는SP명'
이 방법이 훨씬 편하다. SP 명만 정확히 넣으면 스크롤하면서 SP명을 쳐다볼 필요도 없다.
ORACLE에서 함수 내용 확인하는 법.
SELECT text from user_source where name = upper('function_name') order by line
난 암만 봐도 MS빠인 듯... SSMS가 최고인듯....
-- JOIN UPDATE UPDATE ORDERS SET OrderDate = getdate() FROM ORDERS A INNER JOIN [ORDER DETAILS] B ON A.ORDERID = B.ORDERID WHERE B.DISCOUNT > 0.1
-- JOIN DELETE DELETE TABLE_MAIN FROM TABLE_MAIN A INNER JOIN TABLE_JOIN B ON A.SEQNUM = B.SEQNUM AND B.PROGBN = 'Y'
1) NOLOCK (= READUNCOMMITTED)
MS-SQL 서버의 경우 데이터의 일관성을 보장하기 위해 SELECT 작업을 할떄도 공유잠금(S)을 설정합니다.
이러한 경우 SELECT 하는 동안에는 동일한 대상(행,페이지, 테이블 등)에 다른 spid에서 배타적 잠금(X)을 설정할 수 없습니다.
하지만, 이러한 특성 때문에 동시사용자가 많은 환경에서 차단(Blocking) 현상이 발생할 가능성이 있습니다.
즉,
1) 배타적 잠금이 걸린 대상에 대해서는 공유잠금(S)을 설정할 수 없기 때문에 차단이 발생하는 경우와,
2) 공유잠금이 걸린 대상에 배타적 잠금을 설정하는 경우가 모두 차단현상이 발생하는 문제가 발생합니다.
이를 해결하기 위해 SELECT 쿼리의 FROM Clause 다음의 각 테이블에 NOLOCK 옵션을 사용하게 되면 SELECT 쿼리를 할 때 공유잠금을 설정하지 않고 데이터를 읽게 됩니다. 이를 통해, 위의 두 가지 경우 차단현상이 발생하지 않고 작업을 수행할 수 있습니다.
2) ROWLOCK
SQL Server는 기본적으로 행 단위 잠금을 사용합니다. 다만, 내부적인 기준에 따라 행 단위 잠금보다 더 상위단위(페이지, 테이블) 대상에 대해서 잠금을 설정해야 한다면 페이지잠금, 테이블잠금을 자동적으로 승격하여 사용하게 됩니다. 이러한 경우, 특별하게 사용자가 이를 통제하여 행단위잠금을 강제하기 위해서 사용하는 옵션입니다. 이 옵션은 채번과 같은 매우 고유한 업무에 대해서만 제한적으로 사용되어야 합니다.
3)UPDLOCK
UPDLOCK은 SELECT하는 대상에 대해 곧바로 배타적잠금을 설정할 예정인 경우, SELECT 하는 대상에 다른 세션에서 배타적 잠금을 설정하지 못하도록 통제하기 위해 사용합니다.
즉,
1) spid 51 : SELECT * FROM 테이블
2) spid 52 : UPDATE 테이블 SET ...
3) spid 51 : UPDATE 테이블 SET ...
이러한 경우 51번의 업데이트 작업은 52번의 업데이트 작업이 완료될 때까지 차단되고 대기해야 합니다.
이때,
1) spid 51 : SELECT * FROM 테이블 WITH (UPDLOCK)
2) spid 52 : UPDATE 테이블 SET ...
3) spid 51 : UPDATE 테이블 SET ...
를 사용하면, 52번 업데이트 작업이 51번에서 설정된 UPDLOCK으로 인해 차단되고, 3번 UPDATE 작업은 계속하여 진행할 수 있게 됩니다.
이러한 잠금과 관련된 옵션은 데이터 일관성과 병행성이라는 두 마리 토끼를 잡기 위해 노력하면서, 데드락과 같은 문제가 발생하지 않도록 하기 위해, 각 업무환경에 따라 매우 주의하여 사용되어져야 합니다.
쿼리분석기의 단축키
조금 길긴 하지만.. 알아두면 편한것들은 파란색으로 처리하였습니다.. ^^*
작업 | 바로 가기 키 |
---|---|
책갈피: 모든 책갈피 지우기 | Ctrl-Shift-F2 |
책갈피: 책갈피를 삽입하거나 제거(토글) | Ctrl+F2 |
책갈피: 다음 책갈피로 이동 | F2 |
책갈피: 이전 책갈피로 이동 | Shift+F2 |
쿼리 취소 | Alt+Break |
연결: 연결 | Ctrl+O |
연결: 연결 끊기 | Ctrl+F4 |
연결: 연결 끊기 및 하위 창 닫기 | Ctrl+F4 |
데이터베이스 개체 정보 | Alt+F1 |
편집: 활성 편집기 창 지우기 | Ctrl+Shift+Del |
편집: 코드에 주석 달기 | Ctrl+Shift+C |
편집: 복사. Ctrl+Ins와 같음. | Ctrl+C |
편집: 잘라내기. Shift+Del과 같음 | Ctrl+X |
편집: 내어쓰기 | Shift+TAB |
편집: 편집 창 마지막 줄 삭제 | Ctrl+Del |
편집: 찾기 | Ctrl+F |
편집: 해당 줄 번호로 이동 | Ctrl+G |
편집: 들여쓰기 | Tab |
편집: 소문자로 변환 | Ctrl+Shift+L |
편집: 대문자로 변환 | Ctrl+Shift+U |
편집: 붙여넣기. Shift+Insert와 같음 | Ctrl+V |
편집: 주석 제거 | Ctrl+Shift+R |
편집: 최근 검색 재실행 또는 다음 찾기 | F3 |
편집: 바꾸기 | Ctrl+H |
편집: 모두 선택 | Ctrl+A |
편집: 실행 취소 | Ctrl+Z |
쿼리 실행: Ctrl+E와 같음(이전 버전과의 호환성) | F5 |
SQL 쿼리 분석기 도움말 | F1 |
선택한 Transact-SQL 문에 대한 도움말 | Shift+F1 |
탐색: 쿼리와 결과 창 사이 전환 | F6 |
탐색: 창 전환 | Shift+F6 |
탐색: 창 선택기 | Ctrl+W |
새 쿼리 창 열기 | Ctrl+N |
개체 브라우저(표시/숨기기) | F8 |
개체 검색 | F4 |
쿼리 구문 분석 및 구문 검사 | Ctrl+F5 |
인쇄 | Ctrl+P |
결과: 표 형태로 결과 표시 | Ctrl+D |
결과: 텍스트 형식으로 결과 표시 | Ctrl+T |
결과: 분할자 이동 | Ctrl+B |
결과: 파일로 결과 저장 | Ctrl+Shift+F |
결과: 결과 창 표시(토글) | Ctrl+R |
저장 | Ctrl+S |
템플릿: 템플릿 삽입 | Ctrl+Shift+Insert |
템플릿: 템플릿 매개 변수 바꾸기 | Ctrl+Shift+M |
튜닝: 예상 실행 계획 표시 | Ctrl+L |
튜닝: 실행 계획 표시(설정/해제 전환) | Ctrl+K |
튜닝: 인덱스 튜닝 마법사 | Ctrl+I |
튜닝: 클라이언트 통계 표시 | Ctrl+Shift+S |
튜닝: 서버 추적 표시 | Ctrl+Shift+T |
데이터베이스 사용 | Ctrl+U |
[출처] [펌] SQL 쿼리분석기 단축키|작성자 일기
SELECT * FROM DBO.SYSOBJECTS WHERE xTYPE = 'U' AND [NAME] LIKE '%검색어%' -- 테이블명을 LIKE 조건으로 검색 ORDER BY [NAME]
xTYPE의 종류
AF : 집계함수
C : CHECK 제약조건
D : DEFAULT 제약조건 혹은 독립실행형
F : FOREIGN 제약조건
PK : Primay Key 제약조건
P : Stored Procedure
FN : SQL 스칼라함수
S : 시스템 기본 테이블
U : 테이블(사용자정의)
UQ : UNIQUE 제약조건
V : 뷰
SELECT * FROM INFORMATION_SCHEMA.TABLES AS TBL INNER JOIN INFORMATION_SCHEMA.COLUMNS AS CLM ON TBL.TABLE_NAME = CLM.TABLE_NAME WHERE COLUMN_NAME LIKE '%검색어%' AND TABLE_TYPE = 'BASE TABLE' -- 컬럼명으로 검색하여 테이블 정보 출력
SELECT DISTINCT B.NAME FROM SYSCOLUMNS A, SYSOBJECTS B WHERE A.ID = B.ID AND B.XTYPE = 'U' AND A.NAME LIKE '%컬럼명%' -- 해당 컬럼명이 포함된 테이블 이름을 반환
SELECT DISTINCT O.NAME FROM DBO.SYSOBJECTS O INNER JOIN DBO.SYSCOMMENTS C ON O.ID = C.ID WHERE O.XTYPE = 'P' AND C.TEXT LIKE '%KEYWORD%'; -- SP 내에서 내용 검색
/**
author : doeyull.kim
e-mail : purumae@gmail.com
created date : 2009-03-31
description : 기사카테고리를추가합니다.
return value :
0 = 에러가없습니다.
1 = 트랜잭션을Commit할수없는상태입니다. 트랜잭션을Rollback합니다.
100 = 시스템에러가발생하였습니다. dbo.ErrorLogs 테이블을조회하세요.
101 = 상위기사카테고리가존재하지않습니다.
**/
, @nvcCategoryName nvarchar(100) --// 기사카테고리이름.
, @intCategoryID int = NULL OUTPUT --// 기사카테고리일련번호.
/**_# Rollback and return if inside an uncommittable transaction.*/
/**_# 회원정보를쿼리합니다.*/
/**_## 회원정보가존재하지않으면4010105를리턴합니다.*/
/**_# 일반회원계정이아니면, 4010152를리턴합니다.*/
/**_## 14세미만내국인회원가입신청이후보호자동의가완료되지않은상태이면4010112를리턴합니다.*/
/**_## 외국인회원가입신청이후여권확인이완료되지않은상태이면4010120를리턴합니다.*/
/**_## 사용자추가가제한된회원이면, 4010122를리턴합니다.*/
/**_# 회원이가진사용자ID 개수를쿼리하여, 현재3개이상이라면4010111을리턴합니다.*/
/**_# 제재된회원이면, 4010153을리턴합니다.*/
/**_# User를추가합니다.*/
/**_## [Users] 테이블에INSERT합니다.*/
/**_### 이미존재하는User ID이면4010106을리턴합니다.*/
/**_## [UserInformations] 테이블에INSERT합니다.*/
/**_### 이미존재하는닉네임이면4010110을리턴합니다.*/
/**_### 이미등록된이메일이면4010121을리턴합니다.*/
/**_# 가입약관동의를기록합니다.*/
/**_# 메일수신에동의한경우메일링리스트에추가합니다.*/
/**_## [MailingLists] 테이블에INSERT합니다.*/
/**_## [MailingListLogs] 테이블에INSERT합니다.*/
1. Rollback and return if inside an uncommittable transaction.
2. 회원정보를쿼리합니다.
1. 회원정보가존재하지않으면4010105를리턴합니다.
3. 일반회원계정이아니면, 4010152를리턴합니다.
1. 14세미만내국인회원가입신청이후보호자동의가완료되지않은상태이면4010112를리턴합니다.
2. 외국인회원가입신청이후여권확인이완료되지않은상태이면4010120를리턴합니다.
3. 사용자추가가제한된회원이면, 4010122를리턴합니다.
4. 회원이가진사용자ID 개수를쿼리하여, 현재3개이상이라면4010111을리턴합니다.
5. 제재된회원이면, 4010153을리턴합니다.
6. User를추가합니다.
1. [Users] 테이블에INSERT합니다.
1. 이미존재하는User ID이면4010106을리턴합니다.
2. [UserInformations] 테이블에INSERT합니다.
1. 이미존재하는닉네임이면4010110을리턴합니다.
2. 이미등록된이메일이면4010121을리턴합니다.
7. 가입약관동의를기록합니다.
8. 메일수신에동의한경우메일링리스트에추가합니다.
1. [MailingLists] 테이블에INSERT합니다.
2. [MailingListLogs] 테이블에INSERT합니다.
SET NOCOUNT ON;
데이터 타입 |
접두사 |
예 |
char |
chr |
@chrSSN |
varchar |
vch |
@vchTitle |
nchar |
nch |
@nchName |
nvarchar |
nvc |
@nvcSubject |
datetime |
dtm |
@dtmIssuedDate |
smalldatetime |
sdt |
@sdtStartDate |
tinyint |
iny |
@inyBankCode |
smallint |
ins |
@insArticleCount |
int |
int |
@intCustomerSN |
bigint |
inb |
@inbCyberCashAmount |
numeric / decimal |
dec |
@decProfit |
money |
mny |
@mnyRealCashAmount |
binary |
bin |
@binPath |
varbinary |
vbi |
@vbiPassword |
bit |
bit |
@bitCompletedFlag |
timestamp |
tsp |
@tspRowVersion |
uniqueidentifier |
guid |
@guidSubscriptionKey |
xml |
xml |
@xmlPart |
table |
tbl |
@tblNumbers |
date |
dat |
@datLogDate |
datetime2 |
dt2 |
@dt2BeginDate |
datetimeoffset |
dto |
@dtoBasisDate |
time |
tim |
@timLoginTime |
geography |
geg |
@gegLocation |
geometry |
gem |
@gemLocation |
hierarchyid |
hid |
@hidBBSID |
IF XACT_STATE() = -1
BEGIN
SET @intReturnValue = 1;
GOTO ErrorHandler;
END
/**_# [Categories] 테이블에INSERT합니다.*/
SELECT NULL, @intParentCategoryID, @nvcCategoryName, @intCategoryLevel
FROM dbo.Categories WITH (NOLOCK)
WHERE categoryLevel = @intCategoryLevel;
SET @intCategoryID = SCOPE_IDENTITY();
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 547 AND ERROR_MESSAGE() LIKE N'%FK_Categories_Categories%'
SET @intReturnValue = 101;
GOTO ErrorHandler;
END CATCH;
ErrorHandler:
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
IF @intReturnValue IS NULL OR @intReturnValue = 0
EXEC @intReturnValue = dbo.P_AddErrorLog;
RETURN @intReturnValue;
SELECT * FROM ( SELECT Row_Number() OVER (ORDER BY regdate DESC) AS rownum, * FROM TEST_TABLE ) T1 WHERE rownum BETWEEN 1 AND 10
USE [DOOBMS_DB] USE [DOOBMS_DB] GO /****** Object: UserDefinedFunction [dbo].[FN_SPLIT] Script Date: 09/23/2011 17:57:48 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER FUNCTION [dbo].[FN_SPLIT] ( @StrValue CHAR(1000), -- 분리할 문자열 @SplitChar CHAR(1) -- 구분할 문자 ) RETURNS @SPLIT_TEMP TABLE ( VALUE VARCHAR(50) ) AS BEGIN DECLARE @oPos INT, @nPos INT DECLARE @TmpVar CHAR(1000) -- 분리된 문자열 임시 저장변수 SET @oPos = 1 -- 구분문자 검색을 시작할 위치 SET @nPos = 1 -- 구분문자 위치 IF(CHARINDEX(@SplitChar, @StrValue, 1 )= 0 AND @StrValue <> '') BEGIN INSERT INTO @SPLIT_TEMP VALUES( RTRIM(@StrValue)) END ELSE BEGIN WHILE (@nPos > 0) BEGIN SET @nPos = CHARINDEX(@SplitChar, @StrValue, @oPos ) IF @nPos = 0 SET @TmpVar = RIGHT(RTRIM(@StrValue), LEN(@StrValue)- @oPos+ 1 ); ELSE SET @TmpVar = SUBSTRING(RTRIM(@StrValue), @oPos, @nPos - @oPos) IF LEN(@TmpVar)>0 INSERT INTO @SPLIT_TEMP VALUES( @TmpVar) SET @oPos = @nPos + 1 END END RETURN END --select * from fn_split('A;B;C;D;E;F;G;H;',';')