SQL Server MSDN : https://technet.microsoft.com/ko-kr/library/gg699618(v=sql.110).aspx


웹 관련 프로그래머라면...

페이징 처리에 상당한 고민을 하게된다...


데이터가 작다면 상관이 없겠지만... 데이터가 1만건은 기본이고, 100만건 1000만건 정도일 경우...

view화면을 보는 이용자 입장에서는 10건에서 최대 50건 정도를 확인하는데...

100만건을 조회하고 싶지는 않을 것 이다


또한, 시스템도 그 만큼 부하를 받을 것 이다.


my-sql 이나 오라클 같은 경우 limit 과 같은 페이징을 쉽게 할 수 있는 명령 문을 제공한다.

하지만, MSSQL은 지금 것 페이징이라는 것을 제공하지 않았다... 하지만...


하지만...

 

올래~ 홧팅2


2012버전 부터 페이징 관련 명령을 제공한다.


[ORDER BY { order_by_expression [ ASC | DESC ] } [ ,...n][<offset_fetch>] ] 
<offset_fetch> ::= {OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }    [FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY]}


예 )

다음 예에서는 ORDER BY와 함께 OFFSET-FETCH 절을 사용하는 방법을 보여 줍니다.

예제 1 정렬된 결과 집합에서 첫 10개 행을 건너뛰고 나머지 행을 반환합니다.

SELECT First Name + ' ' + Last Name FROM Employees ORDER BY First Name OFFSET 10 ROWS;

예제 2- 정렬된 결과 집합에서 첫 10개 행을 건너뛰고 다음 5개 행을 반환합니다.

SELECT First Name + ' ' + Last Name FROM Employees ORDER BY First Name OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY;


* 자세한 내용은 위에 링크되어 있는 MSDN을 참조 하자!



서버의 IP가 변경되거나,
Administrator 계정의 비밀번호가 변경 되었을 경우 이러한 메시지가 뜬다.
 
이건 꼭 수동 변경을 해줘야 한다는 이야기 ㄱ-;;;
MSSQLServer 와 SQLServerAgent 의 두곳을 작업 해 줘야 한다.

변경 방법은

1. 제어판의 관리도구에서 서비스 선택
2. MSSQLServer 와 SQLServerAgent 에서 오른쪽 클릭하여 속성 선택
3. 로그온 탭에서 암호 및 암호 확인 텍스트 상자에 바뀐 암호를 입력
4. 확인 (안전빵으로 서버 재 부팅) 이렇게 변경하니 잘 된다.
Update를 하는데 그냥 WHERE조건으로 하는게 아니라 다른 테이블과 JOIN을 해서 그 값으로 현재테이블의 값에 넣어야 할 필요가 있어서 사용하게 되었다. 평소에 쓰던 방식과 좀 달라서 어려웠었다.

  1. BEGIN TRAN  
  2.     UPDATE table_1  
  3.     SET column1 = column2  
  4.     FROM table_1 AS A  
  5.     INNER JOIN table_2 AS B  
  6.     ON A.column3 = B.column4  
  7.     INNER JOIN table_3 AS C  
  8.     ON B.column5 = C.column6  
  9. ROLLBACK TRAN  

컬럼수가 많아서 좀 복잡하긴 한데 그냥 내가 쓴 쿼리를 그대로 써 넣었다. (업데이트가 제대로 될지 몰라서 트랜잭션을 걸었다. ㅎㅎ)

컬럼수가 좀 많고 복잡해서 이해가 어려울것 같다. 일단 JOIN이 2번 된 형태이다. table_1에 있는 column1을 table_3에 있는 column2의 값으로 모두 입력해 넣으려고 한 쿼리이다.

일단 업데이트문 자체는 그대로 써주고 그 이하는 SELET문에 쓰는것처럼 FROM절을 사용한다. table_1을 table_2와 JOIN하고 그걸 다시 table_3와 JOIN해서 table_3에 있는 column2를 사용하는 것이다. 이름이 겹치지 않아서인지 column1과 2 따로 별칭을 써주지 않아도 되었다.

평소에 쓰던 쿼리들과는 형태가 좀 다른 형태라 이해가 쉽지 않지만 이렇게 쓰면 Update에 JOIN을 해서 사용할 수 있다.
MS SQL 서버 2000으로 수업프로젝트를 진행하는 가운데 원격컴퓨터에서 서버로 접근이 되지 않아서 고생을 꽤나 했다. 코딩도 바빠죽겠는데 별게 다 신경쓰이게 해서....

SQL 서버가 있는 PC에 2대의 PC가 접근했는데 1대는 문제없이 접근했는데 1대는 서버를 찾을수가 없었다.

항상 트러블슈팅은 어려운 거지만 여기저기 찾아보다가 서비스팩으로 해결했다. 시간이 급해서 정확히 어떤 버그인지까지는 확인하지 못했지만 서비스팩을 업해주지 않으면 생기는 문제이다.

난 전에 SP4가 문제생긴게 있어서 SP3로 업해주었더니 쉽게 해결 할 수 있었다. ㅡ..ㅡ

다른 조에선 비슷한 문제를 SP4를 깔아서 해결했으니 3이든 4든 업데이트 해주면 원격연결 문제는 쉽게 해결할 수 있으리라 생각된다.


덧) 추가적으로 SQL서버를 사용할때 서버이름으로 접근을 하게 되는데 이 이름은 내컴퓨터에서 속성을 눌러서 바꾸어 줄 수 있다.

사용자 삽입 이미지


전체 컴퓨터 이름이 SQL 서버도 사용하는 이름이다. 이름이 맘에 들지 않는다면 변경에 들어가서 바꾸어주면 되고 이름은 리부팅을 해야 적용이 된다.

그리고 이름으로 잘 찾아지지 않을 때는 로컬에서는 이름대신 그냥 .(쩜)을 찍어주면 로컬에 깔려있는 SQL Server에 접근할 수 있다.

SELECT * INTO 생성될 테이블명 FROM 원본 테이블 명

예)    SELECT * INTO target FROM source

단 ) 제약조건이나, Identity 정보는 복사되지 않는다.


MS-SQL 쿼리분석기에서 테이블구조만 복사

Select * into (만들고싶은 테이블) From (소스테이블) Where 0=1


MS-SQL 동일 테이블에서 특정 필드값만 변경해서 복사 하는 방법

INSERT INTO AA

(

    필드1, 필드2, 필드3, 필드4, 필드5

)

SELECT

    '2007', 필드2, 필드3, 필드4, 필드5

FROM AA

WHERE 필드1='2006'


서버에서 테이블 복사하는 법은?

간단하게

BACKUP DATABASE 디비명 TO DISK='경로' WITH INIT
restore database 디비명 from disk ='경로'


위의 두가지 방법으로 하셔도 되는데..

또 다른 방법이 있다면..

1. 테스트 서버에 접속한다.

select * from sysfiles 을 실행..
-> 물리적 파일 위치를 확인한다.

2. 테스트 서버의 기동을 정지시킨다.

3. 탐색기를 연후 1번에서 확인한 파일을 복사한다.(CTRL+C)

4. 원본 서버로 이동시킨다.(CTRL+V)

5. 원본 DB로 접속한다.
sp_attach_db [ @dbname = ] 'dbname' ,
[ @filename1 = ] 'filename_n' [ ,...16 ]
DB를 붙인다.

-> 예) 붙일 DB명이 pubs이고 파일이 아래와 같은때
EXEC sp_attach_db @dbname = N'pubs',
@filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf',
@filename2 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf'

6. use @dbname (해당 DB로 이동한다)

7. 데이터를 확인한다.


* 경로가 틀리면 에러가 납니다. 또는 객체의 소유자가 의도 하지 않았던 것으로
바뀔수 있는데 이는 다시 수정하주면 됩니다.
* 설정하신 인덱스, 사용자, 사용자 정의 함수, 사용자 정의 SP까지 모두 옮겨지게
됩니다.


서버에 있는 테이블을 다른 서버로 옮길 수 있나요?

작업방법은 3 가지 정도가 있을 수 있습니다.

1. 데이터베이스 백업 / 복원

집에 있는 데이터베이스를 백업 받으셨다가 다른 컴퓨터에서 복원하는 방법입니다.

백업방법과 복원방법은 필요하시면 추가 질문 부탁합니다.

2. 데이터베이스 분리/연결

집에 있는 데이터베이스를 잠간 분리했다가 파일을 복사하여 사본을 만들고, 그 사본을 다른 서버로 옮긴다음, 해당 서버에서 다시 연결하면 됩니다.

분리 및 복원방법은 필요하시면 추가 질문 부탁합니다.

3. 데이터 가져오기 및 내보내기

집에 있는 데이터베이스와 옮기고자 하는 서버에 네트워크로 동시에 연결이 가능한 경우라면, 데이터 가져오기 및 내보내기 데이터 가져오기 및 내보내기 유틸리티를 사용하여 데이터와 스키마를 옮길 수 있습니다.

 mdf,ldf 파일을 직접 이동 하는 방법  (추천)

1) A 서버의 서비스를 내린다.

2) A 서버의 mdf, ldf 파일을 카피하여  B 서버로 이동 한다.

  -   디폴트로 SQL   서버를 설치하셨다면 C:\Program Files\Microsoft SQL Server\MSSQL\Data 에 파일가 있을 것임

3) B 서버에서 쿼리 분석기를 실행한다.

4) sp_attach_db 를 이용하여 mdf,ldf 파일을 B 서버에 첨부한다

예) pubs 데이터베이스를 첨부하는 예재

EXEC sp_attach_db @dbname = N'pubs'
   
@filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'
,
   
@filename2 =
N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf'  

sp_attach_db

서버에 데이터베이스를 첨부합니다.

구문

sp_attach_db [ @dbname = ] 'dbname' ,
   
[ @filename1 = ] 'filename_n' [ ,...16 ]

인수

[@dbname =] 'dbname'

서버에 첨부될 데이터베이스의 이름입니다. 이 이름은 고유해야 합니다. dbnamesysname이며 기본값은 NULL입니다.

[@filename1 =] 'filename_n'

데이터베이스 파일 경로를 포함한 물리적 이름입니다. filename_nnvarchar(260)이며 기본값은 NULL입니다. 16개까지 파일 이름을 지정할 수 있습니다. 매개 변수 이름은 @filename1에서 시작하여 @filename16까지 증가합니다. 파일 이름 목록은 데이터베이스의 다른 파일을 지정하는 시스템 테이블이 들어 있는 주 파일을 적어도 하나 이상 포함해야 합니다. 또한 목록은 데이터베이스가 분리된 다음 이동된 모든 파일을 포함해야 합니다.

반환 코드 값

0(성공) 또는 1(실패)

결과 집합

없음

비고

 명시적 sp_detach_db 작업을 사용하여 서버에서 이전에 분리된 데이터베이스만이 sp_attach_db를 사용할 수 있습니다.17개 이상의 파일을 지정해야 하는 경우에는 FOR ATTACH 절이 있는 CREATE DATABASE를 사용하십시오.

데이터베이스가 분리된 서버 외의 서버에 데이터베이스를 첨부한 경우 및 분리한 데이터베이스를 복제할 수 있는 경우, sp_removedbreplication을 실행하여 데이터베이스에서 복제본을 제거해야 합니다.

사용 권한

sysadmin 고정 서버 역할의 구성원만이 이 프로시저를 실행할 수 있습니다.

방법) SELECT * INTO 생성될 테이블명 FROM 복사할 테이블 명

예제) SELECT * INTO locker20091026bak FROM locker

단 ) 제약조건이나, Identity 정보는 복사되지 않는다.

+ Recent posts