MS SQL에서 데이터를 편집할 때 스크립트를 작성하지 않고 편리하게 수정하는 방법으로 아래 그림과 같은 기능을 사용합니다.

 

하지만 데이터가 많을 경우 내가 찾는 데이터가 상위 200개안에 없을 경우 조건을 부여하여 해당 데이터를 편집하는 방법을 설명하겠습니다. 

 

상위 200개 행 편집을 클릭할 경우 아래 그림과 같이 상위 200개에 대해서 데이터가 조회됩니다.

 

조회된 데이터에 우클릭하여 팝업메뉴를 통해 데이터에 조건을 추가할 수 있습니다. 

 

아래 그림과 같이 필터 항목에 원하는 조건 값을 넣고 ctrl + R을 눌러 특정 데이터만 조회 및 편집할 수 있습니다. 

 

위의 기능으로 제공하는 조건은 모두 or 조건이기 때문에 SQL 문을 작성하여 편집할 데이터를 조회하는 방법도 있습니다. 

일반적으로 테이블을 생성할 때 아래와 같이 인덱스를 생성하게 된다.

ALTER TABLE [dbo].[REGION_MGMT] ADD  CONSTRAINT [PK_REGION_MGMT] PRIMARY KEY CLUSTERED 
(
	[REGION_CD] ASC,
	[NATION_CD] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

WITH 다음에 오는 ON/OFF가 무슨 뜻인지 알아보도록 한다.

 

 

LOB_COMPACTION = { ON | OFF }

LOB(Large Object) 데이터가 포함된 모든 페이지를 압축하도록 지정합니다. 
LOB 데이터 형식은 image, text, ntext, varchar(max), nvarchar(max), varbinary(max) 및 xml입니다. 이 데이터를 압축하면 디스크 공간을 더 효율적으로 사용할 수 있습니다. 기본값은 ON입니다.

  • OFF
    큰 개체 데이터가 포함된 페이지가 압축되지 않습니다.
    OFF를 지정해도 힙에는 아무 영향이 없습니다.
    LOB 열이 없는 경우 LOB_COMPACTION 절은 무시됩니다.

PAD_INDEX = { ON | OFF }

인덱스 패딩을 지정합니다. 기본값은 OFF입니다.

  • ON
    FILLFACTOR로 지정된 사용 가능한 공간의 비율이 인덱스의 중간 수준 페이지에 적용됩니다. FILLFACTOR를 지정함과 동시에 PAD_INDEX를 ON으로 설정하지 않으면 sys.indexes에 저장된 채우기 비율 값이 사용됩니다.

  • OFF 또는 fillfactor가 지정되지 않았습니다.
    중간 수준 페이지는 용량 한도 가까이 채워집니다. 이로 인해 중간 페이지의 키 집합을 기준으로 인덱스에 포함될 수 있는 최대 크기의 행 하나 이상을 위한 충분한 공간이 남겨집니다.

SORT_IN_TEMPDB = { ON | OFF }

tempdb에 정렬 결과를 저장할지 여부를 지정합니다. 기본값은 OFF입니다.

  • ON
    인덱스 작성에 사용된 중간 정렬 결과가 tempdb에 저장됩니다. tempdb가 사용자 데이터베이스와는 다른 디스크 세트에 있으면 인덱스를 만드는 데 필요한 시간이 줄어들 수 있습니다. 그러나 인덱스 작성 중에 사용되는 디스크 공간의 크기는 커집니다.

  • OFF
    중간 정렬 결과가 인덱스와 같은 데이터베이스에 저장됩니다.
    정렬 작업이 필요하지 않거나 메모리에서 정렬을 수행할 수 있으면 SORT_IN_TEMPDB 옵션이 무시됩니다.

 

IGNORE_DUP_KEY = { ON | OFF }

데이터 입력 시 PK(UNIQUE) 중복 오류가 발생할 경우 정상적인 데이터만 입력할 것인가 전부 롤백 할 것인가에 대한 설정입니다. 기본값은 OFF입니다.

 

  • ON
    중복된 키 값이 고유 인덱스에 삽입되는 경우 경고 메시지가 나타나고 고유성 제약 조건을 위반하는 행만 실패합니다.

  • OFF
    중복된 키 값이 고유 인덱스에 삽입되는 경우 오류 메시지가 나타나고 전체 INSERT 작업이 롤백됩니다.
    뷰, 고유하지 않은 인덱스, XML 인덱스, 공간 인덱스 및 필터링된 인덱스에 생성된 인덱스의 경우 IGNORE_DUP_KEY를 ON으로 설정할 수 없습니다.

    IGNORE_DUP_KEY를 보려면 sys.indexes를 사용하십시오.

    이전 버전과 호환되는 구문에서 WITH IGNORE_DUP_KEY는 WITH IGNORE_DUP_KEY = ON과 같습니다.

 

STATISTICS_NORECOMPUTE = { ON | OFF }

배포 통계를 다시 계산할지 여부를 지정합니다.
통계가 자동 생성 되지 않으면 데이터 증가 및 분포에 따라 인덱스의 영향도가 줄어 들 수 있으므로 OFF로 설정하는것이 일반적입니다.  기본값은 OFF입니다.

 

  • ON
    이전 통계가 자동으로 다시 계산되지 않습니다.
  • OFF
    자동 통계 업데이트가 설정됩니다.
    자동 통계 업데이트를 복원하려면 STATISTICS_NORECOMPUTE를 OFF로 설정하거나 NORECOMPUTE 절 없이 UPDATE STATISTICS를 실행합니다.
    배포 통계 자동 재계산 기능을 해제하면 쿼리 최적화 프로그램에서 테이블과 관련된 쿼리에 대해 최적의 실행 계획을 선택할 수 없습니다.

ONLINE = { ON | OFF }

인덱스 작업 중에 쿼리 및 데이터 수정에 기본 테이블과 관련 인덱스를 사용할 수 있는지 여부를 지정합니다. 
기본값은 OFF입니다.

XML 인덱스 또는 공간 인덱스의 경우 ONLINE = OFF만 지원되며 ONLINE을 ON으로 설정하면 오류가 발생합니다.

참고
온라인 인덱스 작업은 SQL Server Enterprise, Developer 및 Evaluation Edition에서만 사용할 수 있습니다.

  • ON
    인덱스 작업 중에 장기 테이블 잠금이 유지되지 않습니다. 인덱스 작업의 주 단계 중 내재된 공유(IS) 잠금만 원본 테이블에 유지됩니다. 따라서 기본 테이블 및 인덱스를 계속 쿼리 또는 업데이트할 수 있습니다. 작업이 시작될 때 아주 짧은 기간 동안 S(공유) 잠금이 원본 개체에서 유지됩니다. 작업이 끝날 때 짧은 기간 동안 비클러스터형 인덱스가 생성되는 경우에는 원본에 대해 S(공유) 잠금이 유지되고, 온라인 상태에서 클러스터형 인덱스가 생성 또는 삭제될 때나 클러스터형 또는 비클러스터형 인덱스가 다시 작성될 때는 SCH-M(스키마 수정) 잠금이 획득됩니다. 로컬 임시 테이블에서 인덱스를 생성하는 경우에는 ONLINE을 ON으로 설정할 수 없습니다.

  • OFF
    인덱스 작업 중에 테이블 잠금이 적용됩니다. 클러스터형 인덱스, 공간 인덱스 또는 XML 인덱스를 생성, 다시 작성 또는 삭제하거나 비클러스터형 인덱스를 다시 작성 또는 삭제하는 오프라인 인덱스 작업은 테이블에 대해 SCH-M(스키마 수정) 잠금을 획득합니다. 이 경우 작업 중에 모든 사용자가 기본 테이블에 액세스할 수 없게 됩니다. 비클러스터형 인덱스를 만드는 오프라인 인덱스 작업을 통해 테이블의 S(공유) 잠금을 획득합니다. 따라서 기본 테이블을 업데이트할 수 없지만 SELECT 문과 같은 읽기 작업은 허용됩니다.

ALLOW_ROW_LOCKS = { ON | OFF }

행 잠금의 허용 여부를 지정합니다. 기본값은 ON입니다.

  • ON
    인덱스에 액세스할 때 행 잠금이 허용됩니다. 행 잠금을 사용하는 시점은 데이터베이스 엔진이 결정합니다.

  • OFF
    행 잠금이 사용되지 않습니다.

ALLOW_PAGE_LOCKS = { ON | OFF }

페이지 잠금의 허용 여부를 지정합니다. 기본값은 ON입니다.

  • ON
    인덱스에 액세스할 때 페이지 잠금이 허용됩니다. 페이지 잠금을 사용하는 시점은 데이터베이스 엔진이 결정합니다.

  • OFF
    페이지 잠금이 사용되지 않습니다.

참고
ALLOW_PAGE_LOCKS가 OFF로 설정되면 인덱스를 다시 구성할 수 없습니다.

* SQL Server 2008 이후버전에서 테스트 되었습니다.

 

 

기본적으로 사용법은 아래와 같다.

 

CONVERT( [포맷(길이)], [날짜 값], [변환형식] )

select convert(varchar, getdate(), 120)       -->  2021-01-12 21:23:16
select convert(varchar(10), getdate(), 120)  -->  2021-01-12
select convert(varchar(16), getdate(), 120)  -->  2021-01-12 21:25

 

 

그외 변환형식

convert(varchar, getdate(), 100) mon dd yyyy hh:miAM (or PM) convert(varchar, getdate(), 110) mm-dd-yyyy
convert(varchar, getdate(), 101) mm/dd/yyyy onvert(varchar, getdate(), 111) yyyy/mm/dd
convert(varchar, getdate(), 102) yyyy.mm.dd convert(varchar, getdate(), 112) yyyymmdd
convert(varchar, getdate(), 103)  dd/mm/yyyy convert(varchar, getdate(), 113) mon yyyy hh:mi:ss:mmm (24h)
convert(varchar, getdate(), 104) dd.mm.yyyy convert(varchar, getdate(), 114) hh:mi:ss:mmm (24h)
convert(varchar, getdate(), 105) dd-mm-yyyy convert(varchar, getdate(), 120)  yyyy-mm-dd hh:mi:ss (24h)
convert(varchar, getdate(), 106) dd mon yyyy convert(varchar, getdate(), 121) yyyy-mm-dd hh:mi:ss.mmm (24h)
convert(varchar, getdate(), 107) Mon dd, yyyy convert(varchar, getdate(), 126)  yyyy-mm-ddThh:mi:ss.mmm
convert(varchar, getdate(), 108) hh:mm:ss convert(varchar, getdate(), 130) dd mon yyyy hh:mi:ss:mmmAM
convert(varchar, getdate(), 109) mon dd yyyy hh:mi:ss:mmmAM (or PM) convert(varchar, getdate(), 131)  dd/mm/yyyy hh:mi:ss:mmmAM

 

매번 느끼는 것 이지만.. MS쓰는 쓸때마다 불편하다..

Clustered Index & Non-Clustered Index 

 

테이블을 생성 후 Primary Key를 생성하면 기본적으로 Clutered Index로 지정이 됩니다.(클러스터형 인덱스가 없는 경우)

하지만, 데이터를 파악하고 인덱스를 걸면 가장 효율적인 컬럼을 클러스터 인덱스로 지정하는것을 권장합니다.

 

Clustered Index

  • 해당 컬럼을 기준으로 정렬, 테이블당 1개씩만 허용
  • Clustered Index가 적용된 컬롬은 CUD 작업이 진행될 경우 데이터의 정렬에 관여합니다. 
  • 되도록이면 UNIQUE 해야합니다.  UNIQUE하지 않으면 안되는것이 아니라 UNIQUE하지 않는 경우 오버헤드가 발생하는 것을 인지해야합니다.
  • SP_COLUMNS 명령을 이용해서 사용빈도(높음), 데이터길이(짧음), UNIQUE여부(되도록이면) 인 컬럼을 지정합니다.
  • 목차를 보고 해당 페이지를 찾아 가는것이 아니라 바로 해당 페이지를 찾아가는 것입니다.

 

Non-Clustered Index

  • 한 테이블에 여러개를 생성 할 수 있습니다. (최대 240개)
  • 목차를 보고 해당 페이지를 찾아가는 형태의 검색 방식입니다
  • 테이블에 대한 인덱스를 많이 만들면 테이블의 데이터가 변경될 경우 인덱스도 모두 적절하게 조정되어야 하므로 INSERT, UPDATE, DELETE  MERGE 문의 성능이 저하될 수 있습니다.
  • 쿼리의 조건자 및 조인 조건에서 자주 사용되는 열에 대해 비클러스터형 인덱스를 만듭니다. 

** 인덱스 찾기 **

SP_HELPINDEX <TableName>

어떤 데이터 베이스를 스크립트로 스키마 및 데이터를 포함하여 백업받은 적이 있었습니다.

무려 용량이 60기가정도...


Microsoft SQL Sever Management Studio는 이파일을 읽지 못하고 Out of Memory를 뱉어 냅니다. ㅠㅠ


테스크를 아무리 찾아봐도 스크립트를 통한 Import 기능이 없습니다. (제가 못찾는 것 일 수도..)


파일을 분할하여 야금야금 데이터를 넣는데 30메가 단위로 작업이 되니 60기가를 처리하기에는 시간이 너무 오래 걸려서 다른 방법을 찾아 보았습니다.


SQL Server에도 Comment 명령 기능을 제공하고 있더군요 


바로


sqlcmd 라는 오라클의 sqlplus같은 기능을 하는 녀석입니다. 


기본적인 내용은..



구문

sqlcmd   
   -a packet_size  
   -A (dedicated administrator connection)  
   -b (terminate batch job if there is an error)  
   -c batch_terminator  
   -C (trust the server certificate)  
   -d db_name  
   -e (echo input)  
   -E (use trusted connection)  
   -f codepage | i:codepage[,o:codepage] | o:codepage[,i:codepage] 
   -g (enable column encryption) 
   -G (use Azure Active Directory for authentication)
   -h rows_per_header  
   -H workstation_name  
   -i input_file  
   -I (enable quoted identifiers)  
   -j (Print raw error messages)
   -k[1 | 2] (remove or replace control characters)  
   -K application_intent  
   -l login_timeout  
   -L[c] (list servers, optional clean output)  
   -m error_level  
   -M multisubnet_failover  
   -N (encrypt connection)  
   -o output_file  
   -p[1] (print statistics, optional colon format)  
   -P password  
   -q "cmdline query"  
   -Q "cmdline query" (and exit)  
   -r[0 | 1] (msgs to stderr)  
   -R (use client regional settings)  
   -s col_separator  
   -S [protocol:]server[instance_name][,port]  
   -t query_timeout  
   -u (unicode output file)  
   -U login_id  
   -v var = "value"  
   -V error_severity_level  
   -w column_width  
   -W (remove trailing spaces)  
   -x (disable variable substitution)  
   -X[1] (disable commands, startup script, environment variables, optional exit)  
   -y variable_length_type_display_width  
   -Y fixed_length_type_display_width  
   -z new_password   
   -Z new_password (and exit)  
   -? (usage)  

명령줄 옵션

로그인 관련 옵션
-A
SQL server 관리자 전용된 연결 (DAC)로 로그입니다. 이 연결 유형은 서버 문제를 해결하는 데 사용됩니다. 이 연결은 DAC를 지원하는 서버 컴퓨터에만 사용할 수 있습니다. DAC를 사용할 수 없는 경우 sqlcmd 는 오류 메시지를 생성하고 종료됩니다. DAC에 대한 자세한 내용은 데이터베이스 관리자를 위한 진단 연결을 참조하세요. -A 옵션-G 옵션과 함께 지원 되지 않습니다. -A를 사용 하 여 SQL 데이터베이스에 연결할 때 SQL server 관리자 여야 합니다. DAC는 Azure Active Directory 관리자에 대 한 사용할 수 없습니다.

-C
이 스위치는 클라이언트에서 유효성 검사 없이 암시적으로 서버 인증서를 신뢰하는 데 사용됩니다. 이 옵션은 ADO.NET 옵션 TRUSTSERVERCERTIFICATE = true와 동일합니다.

-d db_name
sqlcmd를 시작할 때 USE db_name 문을 실행합니다. 이 옵션은 sqlcmd 스크립팅 변수 SQLCMDDBNAME을 설정합니다.이 변수는 초기 데이터베이스를 지정합니다. 기본값은 사용자 로그인의 기본 데이터베이스 속성입니다. 데이터베이스가 없을 경우 오류 메시지가 생성되고 sqlcmd 가 종료됩니다.

-l login_timeout
서버에 연결을 시도할 때 ODBC 드라이버에 대한 sqlcmd 로그인 시간 제한(초)을 지정합니다. 이 옵션은 sqlcmd 스크립팅 변수 SQLCMDLOGINTIMEOUT을 설정합니다. 기본 sqlcmd 로그인 제한 시간은 8초입니다. -G 옵션을 사용하여 SQL 데이터베이스 또는 SQL 데이터 웨어하우스에 연결하고 Azure Active Directory를 사용하여 인증하는 경우 최소 30초의 시간 제한 값이 권장됩니다. 로그인 제한 시간은 0에서 65534 사이의 숫자여야 합니다. 입력한 값이 숫자가 아니거나 이 범위에 속하지 않을 경우 sqlcmd 는 오류 메시지를 생성합니다. 값을 0으로 설정하면 제한 시간이 없습니다.

-E
SQL Server에 로그온 할 때 사용자 이름 및 암호를 사용 하는 대신 트러스트 된 연결을 사용 합니다. -E 를 지정하지 않으면 sqlcmd 는 기본적으로 트러스트된 연결 옵션을 사용합니다.

-E 옵션은 SQLCMDPASSWORD 등의 가능한 사용자 이름 및 암호 환경 변수 설정을 무시합니다. -E 옵션과 함께 -U 옵션 또는 -P 옵션을 사용하면 오류 메시지가 생성됩니다.

-g
열 암호화 설정을 Enabled로 설정합니다. 자세한 내용은 Always Encrypted를 참조하세요. Windows 인증서 저장소에 저장된 마스터 키만 지원됩니다. -g 스위치를 사용하려면 적어도 sqlcmd 버전 13.1이 필요합니다. 사용 중인 버전을 확인하려면 sqlcmd -?를 실행하세요.

-G
이 스위치는 Azure Active Directory 인증을 사용하여 사용자를 인증하도록 지정하기 위해 SQL 데이터 웨어하우스 또는 SQL 데이터베이스에 연결할 때 클라이언트에서 사용됩니다. 이 옵션은 sqlcmd 스크립팅 변수 SQLCMDUSEAAD = true를 설정합니다. -G 스위치를 사용하려면 적어도 sqlcmd 버전 13.1이 필요합니다. 사용 중인 버전을 확인하려면 sqlcmd -?를 실행하세요. 자세한 내용은 Azure Active Directory 인증을 사용하여 SQL Database 및 SQL Data Warehouse에 연결을 참조하세요. -A 옵션-G 옵션과 함께 지원 되지 않습니다.


위의 옵션중 -i 옵션을 이용하여 대용량의 데이터를 쉽고 귀찮지 않게 넣을수 있었습니다. 




먼저 해당 데이터베이스가 설치된 PC에서 작업을 기준으로 설명하겠습니다. 


sqlcmd -i <파일경로 + 파일명>




저렇게 한참을 기다린뒤 작업이 마무리가 되어 명령프롬프트가 되돌아 왔습니다. 


실제 데이터도 한글이나 기타 문자도 깨짐이 없이 잘 들어 갔습니다. 



원격으로 작업을 진행하셔야하는 분들은 위의 명령어에 로그인옵션을 추가하여 작업할 수 있습니다. 



sqlcmd -S tcp:<ip address,port> -i <파일경로>






CREATE, DROP 또는 ALTER 문에 알 수 없는 개체 유형 'SEQUENCE'이(가) 사용되었습니다.



SEQUENCE 개체는 SQL Server 2012 부터 지원되는 기능입니다.

아래의 명령어를 통해 해당 데이터베이스의 버전을 확인!!!

select @@version

SQL Server 버전이 11.0.x로 시작해야 SQL Server 2012입니다.

SQL Server 2012 서비스 팩 1    11.00.3000.00
SQL Server 2012 RTM              11.00.2100.60

MS-SQL에서 데이터베이스 복원을 진행하는데 백업을 할때 다음과 같은 메세지가 나온다..


하.. 뭔 놈의 일이 한방에 되는일이 없다... 


아래와 같이 나온다면 

Exclusive access could not  be obtained because the database is in use.

데이터베이스가 사용 중이어서 베타적으로 엑세스 할 수 없습니다.




해당 데이터 베이스를 찍고 우클릭 한뒤 속성에서 아래 그림과 같이 수정한뒤 진행한다.



+ Recent posts