본문 바로가기

SQL Server

(82)
[SQL Server] 테이블 단위 백업 보통 SQL Server는 테이블 백업이 안되는 것으로 알고 있는데 가능하다. 먼저 백업할 테이블이 있는 DB를 선택 후 태스크 → 스크립트 생성 백업하고 싶은 개체 선택 (테이블, 뷰, 저장 프로시저 등...) 백업할 테이블을 선택 스크립팅 옵션 설정에서 고급을 클릭 고급 옵션에서 스크립팅할 테이터 형식을 스키마 및 데이터로 변경한다. (처음엔 스카미로 되어있다.) 스크립트를 저장할 방법을 지정한다. 스크립트 저장 성공 확인 확인해보면 스키마 뿐 아니라 데이터를 저장하는 INSERT 문도 같이 포함된 것을 확인할 수 있다. ※ 100만건의 데이터가 든 테이블을 새 쿼리창에 저장하였을 때 오류가 발생하였다. 하지만 파일로 저장하면 오류 없이 잘 저장된다. 데이터가 많을 때는 파일로 저장하여 백업하자.
[SQL Server] TOP 절에 변수 사용하기 TOP 10 이라고 선언하면 10개의 행만, TOP 15 라고 선언하면 15개의 행만 반환된다. 그렇다면 TOP 절에 변수를 사용할 수 있을까? SQL Server 2005 부터 TOP 절에 변수를 사용할 수 있다. 2000 버전에서 TOP 절에 변수를 사용해보면 오류가 나는 것을 확인할 수 있다. 2005 버전에서 변수를 사용하면 잘 실행된다. 단, TOP (@TOPNUM) 을 선언할 때 ( ) 는 꼭 사용해야 한다. USE PUBS GO DECLARE @TOPNUM INT SET @TOPNUM = 15 SELECT TOP(@TOPNUM) * FROM AUTHORS GO
[SQL Server] SET NOCOUNT ON SET NOCOUNT ON - Transact-SQL 문 또는 저장 프로시저의 영향을 받은 행 수를 나타내는 메시지가 결과 집합의 일부로 반환되지 않도록 한다. SET NOCOUNT 문이 OFF인 상태일 때 SELECT, INSERT, UPDATE, DELETE 의 명령을 실행하면 아래와 같이 영향 받은 행 수를 나타낸다. SET NOCOUNT 문이 ON이면 영향 받은 행 수를 나타내는 메시지가 반환되지 않는다. Transact-SQL 루프가 포함된 프로시저의 경우 SET NOCOUNT를 ON으로 설정하면 네트워크 트래픽이 크게 줄기 때문에 성능이 눈에 띄게 향상된다. 그리고 ON/OFF 둘다 @@ROWCOUNT 함수는 업데이트 된다. 그러므로 프로시저를 생성할 때 습관적으로 SET NOCOUNT ON을..
[SQL Server] 특정 문자열이 포함된 프로시저 찾기 다른 팀에서 자신들의 프로시저를 우리쪽 프로시저 안에서 호출하는지 확인 요청이 왔다. 그 많은 프로시저를 일일이 까보면서 다른 팀의 프로시저를 확인해야 할까... 프로시저 안에서의 프로시저명은 문자열로 취급되고, 아래의 쿼리로 찾을 수 있다. SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_DEFINITION LIKE '%문자열%' ORDER BY ROUTINE_NAME SELECT A.NAME FROM dbo.SYSOBJECTS AS A INNER JOIN dbo.SYSCOMMENTS AS B ON A.ID = B.ID WHERE A.TYPE = 'P' AND B.TEXT LI..
[SQL Server] 로그 파일 크기 축소하기 로그 파일이 급격하게 증가하였을 경우, 로그 파일을 축소하기 위해 DBCC SHRINKFILE 문을 사용하면 된다. 예를들어 TestDB 라는 데이터베이스의 Test_LOG 라는 로그 파일이 현재 3GB이다. 이 로그 파일을 500MB로 축소하기 위해 다음과 같이 실행하면 된다. USE TestDB DBCC SHRINKFILE (N'Test_LOG', 500) 그런데 파일 크기가 축소되지 않는 경우가 있다. 이럴 때는 RECOVERY 모드를 SIMPLE로 변경하여 문제를 해결할 수 있다. -- SIMPLE 모드로 변경 ALTER DATABASE TestDB SET RECOVERY SIMPLE -- 로그 파일 축소 DBCC SHRINKFILE (N'Test_LOG', 500) -- FULL 모드로 변경 A..
[SQL Server] MDF, LDF 파일을 이용한 데이터베이스 복구 데이터베이스를 복구하는 방법은 여러가지가 있다. 백업 파일로 복구하는 방법도 있지만 백업 파일이 없을 경우 MDF, LDF 파일로 복구가 가능하다. 여기서 MDF 파일은 필수적으로 있어야 하지만 LDF 파일은 없어도 복구가 가능하다. MDF, LDF 파일을 이용해서 복구할 때 2가지 방법이 있다. sp_attach_db 시스템 프로시저를 이용하거나 CREATE DATABASE...FOR ATTACH 구문을 사용할 수 있다. 시스템 프로시저를 사용하여 ATTACH 하는 구문 sp_attach_db [ @dbname= ] 'dbname' , [ @filename1= ] 'filename_n' [ ,...16 ] DDL문을 사용하여 ATTACH 하는 구문 CREATE DATABASE database_name ..
[SQL Server] COUNT(*) vs COUNT(컬럼) COUNT(*) 과 COUNT(컬럼) 은 NULL을 포함할 때 다른 결과를 반환한다. COUNT(*) 은 NULL을 포함한 개수를 반환하지만 COUNT(컬럼)은 NULL을 제외한 개수를 반환한다. -- 테스트용 테이블 생성 CREATE TABLE COUNT_TEST ( COL1 INT IDENTITY(1,1) , COL2 INT ) GO -- 데이터 삽입 INSERT INTO COUNT_TEST(COL2) VALUES (1) INSERT INTO COUNT_TEST(COL2) VALUES (NULL) INSERT INTO COUNT_TEST(COL2) VALUES (7) INSERT INTO COUNT_TEST(COL2) VALUES (NULL) INSERT INTO COUNT_TEST(COL2) VAL..
[SQL Server] 테이블의 종류 SQL Server에서 테이블은 모두 네 가지로 나눌 수 있다. 영구 테이블, 로컬 임시 테이블, 전역 임시 테이블, 테이블 변수로 나눌 수 있다. 영구 테이블 : 일반적인 테이블로 데이터베이스가 다시 시작되어도 항상 존재하는 테이블 로컬 임시 테이블 : 테이블 명 앞에 '#'을 붙인다. 사용자 세션 동안만 유지되고 tempdb에 생성된다. 전역 임시 테이블 : 테이블 명 앞에 '##'을 붙인다. 전체 사용자 세션에서 유지되고 tempdb에 생성된다. 테이블 변수 : 배치 동안에만 동작하며, 배치가 끝나면 테이블 변수는 사라진다. 임시 테이블은 생성 후 tempdb..Sysobjects를 검색하면 tempdb에 해당 테이블들이 생성되어 있는 것을 확인할 수 있다. USE TestDB GO CREATE T..