sybase

Edit

관련 자료

identity 관련

ALTER TABLE gas_station ADD COLUMN ref_id NUMERIC(8,0) IDENTITY

Sybase 교육 내용

일시 : 2005/

버전정보

ASE engine의 서버 - ASE(Adaptive Server Enterprise) 현재 15버전까지 나와있음. 12.5 버전 가장 많이 사용

SQL엔진을 Sybase에서 개발했다가 MS에 기술이전후 ASE로 명칭변경(11.5버전부터)

Client tool

isql을 이용한 접속 방법

os>isql -U    -P    -S

옵션은 대소문자 구별함

옵션내용

ASE서버명은 ASE를 인스톨시 DBA가 지정한다.

sa는 oracle의 sys,system과 같은 ASE의 가장 강력한 권한의 로그인

client에서 연결된 하나의 connection = session. 같은 로그인명으로 여러번 connect하면 각각의 하나의 ssession이 이루어진다.

ASE는 각각의 session을 unique한 ID로 서버에서 관리한다.

shutdown과 start 방법

서버엔진 프로세스 확인

OS>showserver

-> dataserver (ASE의 엔진 프로세스. 이거 때 있어야 client에서 connect 할 수 있다.)

start

os>startserver -f run_서버명

shutdown.

is>isql -Usa -P -S
1> shutdown
2>go

DB에서 사용할 수 있는 언어

  1. sql (DDL,DML,DCL)
  2. extension SQL
    • datatype ex)날짜는 datetime
    • clustered index
    • if,while
    • function 변수 (ex> @abc (oracledms :abc 형식)
  3. system procedure
    • 시스템이 제공하는 stored procedure
    • sp_ 로 시작. 약 300여개
1>sp_help
2>go

데이터베이스에 어떤 object가 있는지 모여줌.

Db obejct의 종류

1>sp_help object명

object에 대한 description

1),2),3)를 합쳐서 T-SQL (Transact-SQL)

기본 database

위의 5개는 DBA가 아닌 다른 user가 건드릴 수 없다.

create database a_db 시에 system table(system catalog)이 생긴다. sys,spt_ 로 시작.

1>select * from a_tab
2>go

에서 테이블명,컬럼명, 인덱스 명이 있는지 system_table에서 체크한다. create object를 할 때맏 system테이블에서 정보가 만들어진다.

create table #a.tab은 임시테이블. 임시로 tempdb의 디스크영역에 쓴다. session종료되면 자동으로 없어진다.

Optional DB (default로 생기지는 않음)

생성법

# ASE-12.5/scripts
isql -Usa -P -S -i (옵션설치명)
# installpubs2
# ins_syn_sql
# installdbccdb
1>sp_syntax 'crate table'
 'sp_help'

(각 언어의 syntax를 보여줌)

DB의 존재여부확인 sp_helpdb

로그인 만들기(DBA만 가능)

sp_addlogin a_login, abc123,a.db
1>select db_name()

현재 로그인이 어느 DB에 위치하고 있는지 (sa는 connect시 master에 위치)

default databse: 어떤 로그인 서버에 connect 했을 때 첫번째 위치하게되는 DB

2>use pubs2

(다른 db로 이동)

isql의 syntax

1>select..
2>insert ...
3>delete...
4>go

go 할 때마다 서버로 전달이 되므로 한번만 전달된다.

1>select..
2>go..
3>insert..
4>go..

매번 서버로전달..

batch : client에서 server로 전달되는 하나 이상의 query 중간에 에러가 나면 배치의 모든 query가 rollback이 된다.

테이블 생성과 identity

create table a_ab
( a_col numeric(1,) identity
 b_col char(10) null,
 c_col int not null)

object명이나 column명은 30자까지.

insert의 value뒤의 값들은 single quotation과 double quotation 둘 다 가능.

테이블 생성시 column의 property는 not null이 default로 생성.

identity는

  1. 테이블당1개
  2. numeric(?,0) 1씩 증가하므로 scale은 반드시 0. 삭제시 빈번호는 채워지지 않는다.
  3. insert시 포함시킬 수 없음. insert시에 table명 뒤에 column list가 없어도 자동으로 제외됨.
  4. start value는 1부터

numeric() -> default로 numeric(18,0)

1> alter table a_tabe
modify a_col numeric(2,0)
set indentity_insert a_tab on
insert ito a.tab(a_col,b_col,cOl_ values(5,"aaa",50)

환경변경

  1. 서버 : 메모리영역, 동시 connect session수, 동시 lock수, device 수 - sp_configure
  2. DB : default property 등.. - sp_dboption
  3. session - set

저장 구조와 datatype

char(10) varchar(10)

Data cache 메모리 영역에서 찾고 없으면 disk에서 찾는다.

Disk에 저장되는 물리적인 최소단위= page page는 header와 offset으로 나누어져 있음.

one page의 size= 2k,8k,16k로 지정가능. ASE를 인스톨 할 때 한번 지정가능.. result set이 클수록 page size를 크게 해 주는 것이 좋다.

1>select @@maxpagesize

default:2048 (2kb) 이중 header와 offset를 제외한다면 1962

만약 한 row가 24byte라면 1페이지에는 1962/24=81개의 row가 들어갈 수 있다.

memory 안에서 변경된 page= dirty page 메모리의 dirty페이지를 disk에 write해주는 것은 checkpoint와 housekeepr라는 task가 이 일을 해준다.

CFS=continous Free Space에 새로운 Data가 들어간다.

char(10) abc를 abcdef로 update하면 그 자리에 데이터가 들어간다. varchar(10) abc를 abcdef로 update로 하면 CFS가 없으므로 새로운 공간으로 이동을 하게 된다. 따라서 공간은 varchar가 많이 줄일 수 있지만, update나 delete가 많은 데이터는 char를 추천.

테이블 명이나 칼럼병 변화

sp_rename "a_tab", "b_tab"
sp_rename "a_tab.a_col", "a_tab.z_col"

실수(float) datatype은 os에 dependent 하기 때문에 잘 쓰지 않는다.

nchar, nvachar -> 2byte를 사용했을 경우 쓸 수 있는 data. nchar(10)은 2byte 한글이 10개 들어갈 수 있다.

1 row는 하나의 페이지에 들어가야 한다. 1 row의 size는 페이지 크기를 넘어갈 수 없다.

text는 text page에 들어가고 실제적인 data page에는 16byte address에 저장된다. text는 여러개의 page에 나누어 저장될 수 있다.

unicode= 모든 문자를 16bit로 표현. unicode를 지원하는 서버에서는 unichar,univarchar를 활용 할 수 있음.

image : 2기가 까지. text와 마찬가지로 data page에는 주소만.

concatnation시 char는 남은 빈공간까지 다 들어간다. char(5)의 "aa" ,"bb"가 있다면 두개의 칼럼을 더한다면 "aa bb "이 된다.

select convert(varchar(1),a_col) + b_col from abc
create table test2
(a_col int null,
b_col int default 0 null,
c_col varchar(20) default getdate() null)

null값이 들어올 시 default 값 지정.

default 조건의 삭제

alter table [테이블명]
drop consraint [constraint명]

sp_help 테이블명으로 보면 default절에 해당하는 constraint명이 나온다.

dbo, select into, DML

dbo, object owner : dbo는 해당 DB의 모든 object에 대해서 접근할 수 있다.

select into : 테이블간의 copy. 테이블의 생성과 함꼐 data를 copy한다. 단 constraint나 index는 copy 되지 않는다.

다른 DB나 다른사용자의 table보기

select * from pubs2.a_user.titles;

만약 object owner가 dbo라면 user명은 생략가능.

select * from pubs2..titles;

select * into abc_copy from abc;

select into를 사용하기 위해서는 database option이 지정이 되어 있어야 한다.

1>use master
2>go

1>sp_dboption user02_db, "select into". true
2>go

1>use user02_db
2>go

1>checkpoint
2>go
delete a_tab
from a_tab, b_tab
where a_tab.a=b_tab.a
and a_ab.a="bb"

case : when에 없는 값은 null로 된다. where절로 제한을 하거나 else로 명시해 주지 않은 다른 값들일 경우 처리를 해준다. else type -> 그대로 둔다.

view

view의 특징 (virtual table)

  1. network traffic을 줄여줄 수 있다.
  2. select query를 simple하게 수행
  3. 부분적인 권한을 부여하기 위해서
create view a_view
as
select
..

create view를 할때 syscomments라는 system table에 저장이 된다. sp_helptext a.view 로 하면 view에 대한 정보를 보여준다.

index

create index a_ind on a_tab(a_col)

sp_helpindex: 인덱스 정보만본다.

index의 종류

noncluestred,nonunique가 default

clustered index를 생성하면 index에는 leaf level이 없고 index page는 바로 data page를 가리키게 되고, data page의 data row는 index_page의 순서대로 정렬된다. 테이블당 오직 1개만 만들 수 있다.

nonclustered index는 249개까지 만들 수 있다.

query plan 보는 방법

2005.03.17 Sybase 교육

sp_who : 각각의 session에 대한 status

이 명령어실행시 hostname이 없는 것들 task task : ASE서버가 쓰는 process

sysmessages 는 master db에만 유일하게 존재하는 시스템 테이블

sp_help sysobjects : name id type uid

select
object_id('name')
object_name(id)
db_id('name')
db_name(id)
user_id('name')
user_name(id)

시스템테이블

batch에 들어갈 수 없는 명령어

위의 명령어 다음에는 바로 go가 와야 하므로 batch에 들어갈 수 없다.

batch안에서 생성된 변수는 batch가 끝나면 소멸된다.

동일한 object를 drop하고 creation 하는 문장을 동시에 한 batch에 넣을 수 없다.

변수사용시 주의점

변수를 할당하는 문장과 그 변수를 다시 사용하는 문장은 분리된 문장으로 나와야 한다.

변수는 배열이 아니므로 select절의 결과로 대입되는 값이 여러개일 경우 마지막 값이 들어간다.

한번 사용한 변수가 값이 초기화되지 않고 다시사용될때, 그변수가 결과값이 없는 select절의 칼럼값이 대입된다하더라도, null값이 나오지 않고 앞에서 정의한값이 나온다.

static sql에서는 컬럼명과 테이블명은 변수로 받을 수 없다.

동적SQL에서 못 쓰는 문장들

transaction

unchained mode : 작업의 시작을 명시적으로 서버에 알림.

begin tran
commit tran
rollback tran

chained mode : 묵시적으로 쿼리가 시작됨과 동시에 서버에 트랜잭션의 시작을 알림. commit tran, rollback tran으로

ASE의 default transanction mode는 unchained mode이다.

set chained on

unchained mode에서 begin tran을 명시하지 않은 모든 문장은 auto-commit이 된다.

transaction 안에서 go라는 문장은 auto-commit이 아니고 네트워크를 몇번 타느냐만을 결정한다. chained mode에서는 trancount가 0이 될 수가 없다. 즉 trancount를 조회하는 문장자체도 transaction이기 때문이다.

data cache에는 data page, index page , log page가 올라간다. 모든 database에는 data 영역과 transaction log 영역이 있다. transaction log에는 insert,update,delete의 기록이 남는다.

transaction 종료와 동시에 transaction log에 기록.

auto-recovery : ASE의 서버가 data page와 transaction log를 일치화 시키는것.

DB backup

truncate와 delete from

테이블의 데이터를 전부 다 날릴떄 truncate가 더 빠르다. transaction log에 모든 정보를 남기지 않고 allocation 정보만를 남기기 때문. begin tran 내에서 truncate를 쓸 수 없다.

select into 도 마찬가지

lock

shared lock이 걸려있는 페이지에 insert,update,delete를 걸면 transaction이 종료할때까지 wait가 걸린다.

eXclusive lock : insert,delete,update 중인 row가 있으면 select는 wait, insert,update,delete도 wait

Update lock : update 중이면 select는 ok insert,update,delete는 wait

select query 위주의 테이블이면 all page lock scheme이 좋고, insert,update,delete가 많다면 DataRow Lock Scheme을 할 수 밖에 없다. 그러나 Data row Lock shceme은 lock를 관리하기 위한 메모리 영역 자원이 많이 든다.

Lock Scope : 테이블 전체에 걸수 있는 lock 종류

  1. isolation level 3 : 테이블 전체에 S lock
  2. select from a_tab hold lock -> S lock
  3. lock table -> S lock,X lock

Intent Lock : 테이블간에 상이상 락을 잡지 않도록 테이블 lock 상태를 flag로 표시함. sp_lock, sp_who 으로 확인 가능.

sp_config "lock scheme"  -- default lock scheme 확인
sp_config "lock scheme" ,0,  datarows

또는 create table 이나 alter table에서 lock datarows, lock allpages 의 라인을 추가

deadlock이 걸릴 경우 ASE에서 deadlocktune이라는 task가 강제로 하나를 rollback시킴.

cbcc checktable(table명)

isolation level

set transaction isolation level 0

@@isolation 변수에서 조회가능. default값은 1

에러메시지 정의

sp_addmessage 20001,"a_tab not found"

메시지 번호는 20000번 이상으로 정의. sysusermessages 테이블에 저장된다. 에러메시지 호출 방법 raiseerror 20001

syscomments에 procedure에 대한 ddl문이 저장되어 있다. sysprocedure에 procedure에 대한 query tree를 저장. 매번 parsing을 거치지 않으므로 효율적이다.

sp_helptext 함수명 : 함수에 대한 ddl

object

Object-Nameing  Convention
   1)  Objcet  Name
      (1) Table, default, Procedure등 모두 해당됨
      (2) 대 소문을 구분하여, 최대 30characters
      (3) Object name identify ? db, owber, table (puds2. Friend)-dbo일 경우 생략가능
   2) Transact ? SQL
      (1) 대 소문자 구분 없음(select  or  SELECT)
      (2) 축약형가능(procedure:proc, execute: exec, transaction: tran 등)
   3) 타 DB와  Join
      1>  select  a.name, b.amount from friend a, pubs ... charg b
      2> where a.id = b.id
      3> go
   4) Object 종류 - Table, View, Index, Default, Rule, Procedure, Trigger등이 있음

alter table

자료출처 : http://blog.naver.com/skytango?Redirect=Log&logNo=100005088296

alter table시 다음과 같은 에러메시지가 나면

The 'select into' database option is not enabled for database 'kems'. ALTER
TABLE with data copy cannot be done. Set the 'select into' database option and
re-run.
use master
go
sp_dboption DB명 , "select into", true
go
use DB명
go
checkpoint
go

sp_dboption 할 때 다음과 같은 메시지를 보신다면...

The transaction log in database master is almost full. Your transaction is
being suspended until space is made available in the log.
dump tran master with no_log
go
alter table NationVisited  modify orgPriorConsultCnt  int null

key constraint 더하기

ALTER TABLE CM_MAINCD ADD CONSTRAINT CM_MAINCD_PK
PRIMARY KEY ( MAIN_CD )

ALTER TABLE CMMAIN_CD ADD CONSTRAINT CM_SUBCD_FK01
FOREIGN KEY ( MAIN_CD )
REFERENCES CM_MAINCD ( MAIN_CD)

temp테이블을 이용한 페이징

-- 첫번째 방법(토탈값 구할때 조인해서 구하는 방법)
SET ROWCOUNT 12000             -- 페이지 * rows

SELECT ROWNUM = IDENTITY(6),
       *
  INTO #ATHENA_DVD_USER_INFO_TEMP
FROM   ATHENA_DVD_USER_INFO
WHERE  USER_ID LIKE '1%'

SELECT A.*, B.TOTAL
FROM   #ATHENA_DVD_USER_INFO_TEMP A,
       (SELECT COUNT(*) TOTAL
        FROM   ATHENA_DVD_USER_INFO
        WHERE  USER_ID LIKE '1%') B
WHERE  ROWNUM BETWEEN 11991 AND 12000  -- (페이지- 1) * rows +1 and 페이지 * rows

SET ROWCOUNT 0

DROP TABLE #ATHENA_DVD_USER_INFO_TEMP
-- 두번째 방법(토탈값 구할때 DECLARE 이용해서 구하는 방법)
DECLARE @TOTAL INT
    SELECT @TOTAL = COUNT(*)
    FROM   ATHENA_DVD_USER_INFO
    WHERE  USER_ID LIKE '1%'
SET ROWCOUNT 12000             -- 페이지 * rows

SELECT ROWNUM = IDENTITY(6),
       *
  INTO #ATHENA_DVD_USER_INFO_TEMP
FROM   ATHENA_DVD_USER_INFO
WHERE  USER_ID LIKE '1%'

SELECT *, @TOTAL TOTAL
FROM   #ATHENA_DVD_USER_INFO_TEMP
WHERE  ROWNUM BETWEEN 11991 AND 12000  -- (페이지- 1) * rows +1 and 페이지 * rows

SET ROWCOUNT 0

DROP TABLE #ATHENA_DVD_USER_INFO_TEMP

동적 쿼리 만들기

검색화면에서 입력된 조건값으로

  1. declare, if..else 등을 활용하여 조건별 문장을 생성
  2. exec(문자열) 구문 활용하여 실행

예제) sql-mapping.xml

declare @sql varchar(40)
declare @where_cond varchar(30)

select @sql = "select  *  from ATHENA_DVD_USER_INFO"
select @where_cond = " where user_id = '11'"
exec(@sql+@where_cond)

반복문 효과 쿼리

set rowcount 0
declare @index numeric(3)
declare @rows  numeric(4)
declare @cont varchar(2000)
declare @cd  char(3)

drop table #TEMP00

select A.CD, A.CD_NM, isnull(B.CNT,0) CNT
into #TEMP00
from AM_IA_CD A,
(select ORG_CD, DISP_KIND_CD, COUNT(*) as CNT
from AM_IDEN_DISP
where ORG_CD = '090000000000' and YEAR = '2005'
group by ORG_CD, DISP_KIND_CD) B
where A.ORG_CD = B.ORG_CD
      AND A.CD = B.DISP_KIND_CD
     AND  A.CD_TYPE = 'TO03'
and A.ORG_CD = '090000000000'  and CD!='000000000'

set @index =1
set @cd  = '000'
select @rows   = count(*) from #TEMP00

set rowcount 1
while (@index <= @rows   )
begin
select @cd =  CD from #TEMP00 where CD > @cd

select @cont =  @cont + (case when @index>1 then ',' end) + CD_NM + ' ' + convert(varchar,CNT) + '건'  from #TEMP00
                              where CD > @cd
select @index = @index+1

end

select @cont
drop table #TEMP00
set rowcount 0

날짜 함수

DATEADD

지정한 날짜에 시간 간격을 더하여 새 datetime 값을 반환

USE PUBS
SELECT * FROM Titles

SELECT title_id, title, pubdate, DATEADD(DD,10,pubdate) as '10일더함'
FROM Titles

DATEDIFF

지정한 두 날짜 간에 교차되는 날짜와 시간 경계값을 반환합

SELECT title_id, title, pubdate,
 DATEDIFF(yy,pubdate,getdate()) as '현재날짜와의 연도차이'
FROM Titles

(자세한 내용은 아래 "datediff 함수 설명" 참고)

DATENAME

지정한 날짜의 특정 날짜 부분을 나타내는 문자열을 반환

SELECT DATENAME(dw,GETDATE()) as '요일' --결과 : 현재날짜의 요일 출력
--dw : 1~7 중 1 이 일요일
SELECT DATENAME(mm, GETDATE()) as '월'  --결과 : 8월 이므로 8 출력

DATEPART

지정한 날짜의 특정 날짜 부분을 나타내는 정수를 반환

SELECT DATEPART(mm,GETDATE()) AS '월' --결과 : 8
SELECT DATEPART(dy,GETDATE()) AS '일년 중 오늘까지의 날짜 수' --결과 : 218

GETDATE

현재 시스템의 날짜와 시간 반환

SELECT GETDATE()  --결과 :2004-08-05 19:02:11.420

YEAR

지정한 날짜의 연도 부분을 표시하는 정수를 반환

SELECT title_id, title, pubdate,YEAR(pubdate) as '연도'
FROM Titles

MONTH

지정된 날짜의 월 부분을 나타내는 정수를 반환

SELECT title_id, title, pubdate,MONTH(pubdate) as '월'
FROM Titles

DAY

지정한 날짜의 일 부분을 나타내는 정수를 반환

SELECT title_id, title, pubdate,DAY(pubdate) as '일'
FROM Titles

datediff 함수 설명

DATEDIFF : 지정한 두 날짜 간에 교차되는 날짜와 시간 경계값을 반환합니다.

구문

DATEDIFF ( datepart , startdate , enddate )

인수

datepart

차이를 계산할 날짜 부분을 지정하는 매개 변수입니다. 다음은 Microsoft® SQL Server™에서 인식하는 날짜 부분과 약어입니다.

날짜 부분 약어
Year yy, yyyy
quarter qq, q
Month mm, m
dayofyear dy, y
Day dd, d
Week wk, ww
Hour hh
minute mi, n
second ss, s
millisecond ms

startdate

계산의 시작 날짜입니다. startdate는 날짜 형식에서 datetime 또는 smalldatetime 값이나 문자열을 반환하는 식입니다.

smalldatetime은 분 단위로만 정확하므로 smalldatetime 값을 사용할 경우 초와 밀리초는 항상 0입니다.

연도의 마지막 두 자리 숫자만 지정할 경우 two digit year cutoff 구성 옵션 값의 마지막 두 자리 숫자보다 작거나 같은 값은 구분 기준 연도와 같은 세기에 해당합니다. 이 옵션 값의 마지막 두 자리 숫자보다 큰 값은 구분 기준 연도보다 이전 세기에 해당합니다. 예를 들어, two digit year cutoff가 2049(기본값)일 경우 49는 2049년으로 해석되고 2050은 1950년으로 해석됩니다. 이러한 애매함을 피하기 위해 네 자리 연도를 사용하십시오.

시간 값 지정에 대한 자세한 내용은 시간 형식을 참조하십시오. 날짜 지정에 대한 자세한 내용은 datetime 및 smalldatetime을 참조하십시오.

enddate

계산의 종료 날짜입니다. enddate는 날짜 형식에서 datetime 또는 smalldatetime 값이나 문자열을 반환하는 식입니다.

반환 형식 : integer

비고

enddate에서 startdate를 뺍니다. startdate가 enddate보다 크면 음수 값이 반환됩니다.

DATEDIFF의 경우, 결과가 정수 값의 범위를 벗어나면 오류가 발생합니다. 밀리초의 경우, 최대값은 24일, 20시간, 31분, 23.647초입니다. 초의 경우, 최대값은 68년입니다.

분, 초, 밀리초 등 교차된 경계값을 계산하는 방법은 DATEDIFF의 결과가 모든 데이터 형식에서 일관성을 유지시킵니다. 결과는 첫 번째 날짜와 두 번째 날짜 사이에 겹쳐지는 datepart 경계값에 해당하는 부호 있는 정수값입니다. 예를 들어, 1월 4일 일요일과 1월 11일 일요일 사이의 주 수는 1입니다.

예제

다음은 pubs 데이터베이스의 titles 테이블에 대해 현재 날짜와 출판 날짜 간의 일 수 차이를 확인하는 예제입니다.

USE pubs
GO
SELECT DATEDIFF(day, pubdate, getdate()) AS no_of_days
FROM titles
GO

날짜형(datetime)의 문자열 변환시 style number

subase에서 select convert(varchar,getdate(),112)로 찍어보면 오늘 날짜가 20070831 형식으로 나오죠. 이런 형식들이 정리된 자료를 한 번 만들어 보았습니다.

제가 쓰는 sybase 버전은 12.5.3입니다. (select @@version)으로 확인할 수 있죠)

select convert(varchar,날짜데이터, convertType) 형식으로 쓰고 convertType 위치에 숫자가 들어갈 때 옆에 적힌 형식대로 나온다고 보시면 됩니다. 예시로 옆에 찍힌 날짜는 2007년 8월27일입니다.

Style number

0 = Aug 27 2007  5:28PM
1 = 08/27/07
2 = 07.08.27
3 = 27/08/07
4 = 27.08.07
5 = 27-08-07
6 = 27 Aug 07
7 = Aug 27, 07
8 = 17:23:35
9 = Aug 27 2007  5:28:08:563PM
10 = 08-27-07
11 = 07/08/27
12 = 070827
13 = 07/27/08
14 = 08/07/27
15 = 27/07/08
16 = Aug 23 2007 17:28:08
18 = 15:17:08
19 = 5:11:39:086PM
20 = 17:12:30:633
21 = 07/08/27
22 = 07/08/27
100 = Aug 27 2007  5:28PM
101 = 08/27/2007
102 = 2007.08.07
103 = 27/08/2007
104 = 27.08.2007
105 = 27-08-2007
106 = 27 Aug 2007
107 = Aug 27, 2007
108 = 17:28:08
109 = Aug 27 2007 5:28:08:563PM
110 = 08-27-2007
111 = 2007/08/27
112 = 20070827
113 = 2007/27/08
114 = 08/2007/27
115 = 27/2007/08
116 = Aug 23 2007 17:28:08

응용

오늘날짜를 YYYYMMDD로

select convert(char,GETDATE(),112)

현재 날짜 하루전을 yymmdd형식으로 출력

select convert(char(8), DATEADD(DD,-1,getdate()) ,112)

2007년 8월 27일 전날을 출력. string -> datetime은 convert라는 함수를 사용하지 않고 내부적(implicit)으로 자동으로 변경됩니다

select convert(char(8), DATEADD(DD,-1,'20070827') ,112)

현재 분일초,밀리세컨드까지: 152515853

select str_replace( convert(varchar,getdate(),20),':',null)

현재 연월일시분초밀리세컨드를 다 붙여서

select convert(varchar,GETDATE(),112) || str_replace( convert(varchar,getdate(),20),':',null)

문자 함수

문자치환

declare @STR1 varchar(100), @STR2  varchar(100), @STR3 varchar(100)
set @STR1 = '가나다라마바사아 인간은 8020가나다라'
set @STR2 = '8020'
set @STR3 = '8010'

select @STR1

select str_replace(@STR1,@STR2,@STR3)

복잡하게 하면

select substring(@STR1, 1, charindex(@STR2 ,@STR1) -1) + @STR3
+ substring(@STR1, charindex(@STR2 ,@STR1) + datalength(@STR2), datalength(@STR1))

특정 문자 근처를 출력

declare @STR1 varchar(100), @KEYWORD  varchar(100)
set @STR1 = '가나다라마바사아 인간은 가나다라'
set @KEYWORD = '인간'
select substring(@STR1, charindex(@KEYWORD ,@STR1) - 3, datalength(@KEYWORD) + 3 )

문자반복

SELECT REPLICATE('0', 3 - DATALENGTH(c1)) + c1 AS [Varchar Column], REPLICATE('0', 3 - DATALENGTH(c2)) + c2 AS [Char Column] FROM t1

Children