목록Database/SQL Server (12)
IT 성장일기

문자열이나 이진 데이터는 잘립니다. (String or binary data would be truncated) 주로 컬럼 길이보다 긴 데이터를 삽입하려고 시도할 때 발생하는 예외입니다. SQL Server(MS SQL)와 함께 작업을 하다 보면 꽤나 빈번하게 마주치는 예외메시지입니다. 컬럼의 최대 문자열 길이를 늘여주거나, 삽입하고자 하는 데이터의 길이를 줄이는 것으로 해결 수 있습니다. 개인적으로 문자열 데이터의 길이를 줄이는 것은 권장하지 않는데 그 이유는 다음과 같습니다. 데이터의 손상이나 변경을 초래할 수 있음. 컬럼의 길이를 초과하는 데이터의 삽입이 또 다시 실행될 수 있음. 컬럼 길이 조절하기 아래 SQL을 실행하여 테이블의 컬럼 길이를 조회하고 수정할 수 있습니다. /*컬럼 길이 조회하기*..

SQL Server 테이블 정보 확인하기 SQL Server에서 현재 인스턴스에 생성된 DB 객체와 각 DB의 테이블 리스트, 테이블 구조 등을 조회할 수 있습니다. DB 객체 조회하기 SELECT * FROM SYS.sysdatabases 주요 항목 : DB name SID status create date mdf file name version 테이블 리스트 조회하기 SELECT * FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_NAME /*order by 옵션은 생략해도 상관 없습니다.*/ 주요 항목 : table catalog (DB name) table schema table name table type 테이블 구조 조회하기 SELECT * FROM INFOR..

테이블 컬럼에 설명 추가, 수정, 삭제 및 조회하기 SQL Server에는 테이블 생성 시 직접 코멘트를 추가하는 기능은 제공되지 않지만 확장속성을 활용하여 테이블 메타데이터와 비슷한 정보를 추가할 수 있습니다. 물론 DBeaver 등 IDE를 활용하면 더욱 간편하게 테이블을 생성/수정할 수 있지만 개발자라면 툴 뿐 아니라 코드를 다룰 수 있어야 하므로 배워보도록 하겠습니다.😤 예시를 위해 테이블 이름은 DUMMY_TABLE, 데이터베이스 이름은 임의로 DATA_VASE라고 하겠습니다. 테이블 생성 먼저 아래 쿼리로 Dummy 테이블을 생성하겠습니다. CREATE TABLE DATA_VASE.DBO.DUMMY_TABLE ( NAME NVARCHAR(50) NOT NULL , AGE NUMERIC(3) ,..

SQL Server 트랜젝션 로그 비우기 매주 자동으로 백업되도록 설정해 놓은 데이터베이스가 백업되지 않은 상태로 있어서 수동으로 백업을 시도해 봤습니다. 백업은 성공적으로 이루어지지 않았고 트랜잭션 로그가 가득 차서 백업할 수 없다는 메시지를 반환받았습니다. 트랜잭션 로그 SQL Server는 크게 아래 두 가지 파일로 역할을 나누어 데이터를 기록합니다. mdf 파일 : 실제 데이터가 저장되는 데이터베이스 파일 ldf 파일 : 데이터베이스에 대한 처리를 기록하는 파일 트랜잭션 로그는 ldf 파일에 기록되며 데이터베이스에서 실행되는 모든 쿼리가 기록되는 로그입니다. 그런데 이 ldf 파일의 저장 공간이 가득 차면 SELECT 문을 제외한 다른 모든 데이터 조작 명령에 대한 처리가 실패하게 됩니다. 생각보..

SQL Server 데이터베이스(복원중..) 해결 방법 SQL Server DB를 복원하던 중 복원이 실패하고 연결, 접속도 되지 않는 증상이 발생했습니다. 문제가 발생한 데이터베이스 스키마에는 (복원중...) 이라는 표시 메시지가 붙어있었습니다. 구글링을 해본 결과 데이터베이스 복원 시 NoRecovery 옵션을 사용하게 되면 데이터베이스를 온라인으로 전환하지 않고 UnRecovered State로 유지한다는 답을 찾게됐습니다. 해결방법은 새로운 쿼리창을 열고 아래 쿼리를 입력하면 됩니다. RESTORE DATABASE DATABASE_NAME WITH RECOVERY 도움이 되어드렸다면 구독 / 좋아요 부탁드립니다.👏🏻 감사합니다.🙂

SQL Server 쿼리 성능 측정과 개선 어느 날 진행 중인 프로젝트에서 한 쿼리의 성능이 이슈가 된 적이 있었습니다. 임시 테이블 A의 조건절에 조건 값으로 A 값과 B 값을 각각 넣었을 때, 두 조건 사이의 조회되는 데이터 양이 크게 차이가 나지 않음에도 불구하고, 조회 시 약 30배 차이의 소요시간이 걸리는 결과를 보여줬습니다. (해당 조건은 애플리케이션의 가장 기본이 되는 조건으로써 대부분의 테이블에서 사용되는 컬럼값입니다.) 해당 쿼리는 여러 개의 테이블 정보를 조인해서 완료 건수, 전체 건수, 비율 등 가공된 결과를 가져오는데, 여러개의 임시 테이블을 선언해서 결과에 필요한 재료데이터들을 먼저 조회하는 구조였습니다. 각각 임시테이블은 5개의 테이블과 조인된 뷰를 조회하고 있었고 그 외에도 필..

SQL Server 테이블 복사하기 기존의 테이블과 동일한 구조의 테이블을 만드는 방법은 여러가지가 있겠지만 SELECT INTO FROM 절을 이용하면 정말 간단하게 테이블을 복제할 수 있습니다. SELECT * INTO TB_NEW_TABLE FROM TB_ORIGINAL_TABLE 기본 구문은 위와 같습니다. 위 쿼리를 실행하면 기존 테이블의 모든 정보가 새로운 테이블에 복제됩니다. 하지만 경우에 따라 특정 정보를 가공해서 복제하고 싶은 경우도 있을 것 입니다. 그럴 땐 다른 테이블과 JOIN을 하거나 WHERE 절을 이용해 데이터를 골라내는 방법도 사용할 수 있습니다. SELECT * INTO TB_NEW_TABLE FROM TB_ORIGINAL_TABLE WHERE 1=1 AND some_col..

SQL Server 컬럼으로 테이블 정보 조회하기 다수의 테이블이 같은 이름의 컬럼을 가지고 있는 경우가 있습니다. 그럴 때 해당 컬럼 이름을 이용해서 해당 컬럼을 포함하는 모든 테이블의 정보를 조회하는 쿼리입니다. SELECT * FROM DB_MY_DB.DBO.INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'COLUMN_MY_COLUMN' [DBO.INFORMATION_SCHEMA.COLUMNS] 부분은 데이터베이스 오브젝트의 스키마 구조 중에서도 컬럼을 조회한다는 의미입니다. 해당 쿼리를 실행하게 되면 알 수 있는 대표적인 정보는 아래와 같습니다. Table name Nullable Data type Minimum data length Maximum data l..

SQL Server 서로 다른 데이터베이스의 함수, 프로시저 비교하기 DB를 마이그레이션 할 때 두 DB의 테이블 구조를 비교하는 것도 필요하지만 정의된 함수나 프로시져도 동기화해야 합니다. 지난번 포스팅했던 내용을 참고하여 응용한 아래 쿼리를 이용하면 각 DB의 함수와 프로시져의 목록을 가져올 수 있습니다. SELECT A.SPECIFIC_CATALOG AS A_DB, A.SPECIFIC_NAME AS A_OBJ, A.ROUTINE_TYPE AS A_TYPE, B.SPECIFIC_CATALOG AS B_DB, B.SPECIFIC_NAME AS B_OBJ, B.ROUTINE_TYPE AS A_TYPE FROM DB_A.INFORMATION_SCHEMA.ROUTINES A LEFT OUTER JOIN DB..

SQL Server 서로 다른 데이터베이스의 테이블 구조 비교 DB를 마이그레이션 할 때 데이터를 옮겨 담기에 앞서 서로 다른 DB의 테이블 구조나 데이터 타입을 비교하여 일치시켜야 할 필요가 있습니다. 조건은 아래와 같습니다. DB_A와 DB_B가 존재함 각각 동일한 테이블이 존재함 (DB_A.dbo.TBL, DB_B.dbo.TBL) 각 테이블 id를 알고 있음 DB_A와 DB_B의 같은 테이블의 컬럼 구조를 비교하기 SELECT * FROM DB_A.dbo.syscolumns WHERE id='10101010' EXCEPT SELECT * FROM DB_B.dbo.syscolumns WHERE id='01010101' 테이블, 컬럼, 데이터 타입과 데이터 길이제한 조회하기 SELECT A.table_..

SQL Server 설치에러 0x84BB0001 SQL Server를 설치하다가 오류 메시지를 접했습니다. 일부분 설치에 성공하기는 했지만 디자인툴과 디비와의 연결도 실패했으니 결과적으로는 실패했다고 보는 것이 맞는 것 같습니다. 원인을 추측해보자면 예전에 SQL Server Developer 버전을 PC에 설치했다가 지운 적이 있었습니다. 그 때 깔끔하게 지운게 맞는지 아닌지 알 수 없고 잔여물이 존재하여 설치가 일부 실패한 것인지는 알 수 없지만 해결 방법을 찾던 중 해당 에러코드는 SQL Server를 설치한 적 없는 사람에게도 발생한 바 있다는 글을 발견했습니다. https://learn.microsoft.com/en-us/answers/questions/680707/getting-0x84bb00..

SQL Server(setup.exe)를 설치할 수 없습니다 한번 데스크탑에 데이터베이스를 설치하게 되면 그 인스턴스를 깔끔하게 삭제하는 것은 정말 쉬운 일이 아닌 것 같습니다. 예전에 데스크탑에 SQL Server 2019 인스턴스를 설치하고 삭제한 적이 있었는데 그 때 뭔가 잘못되었는지 아래와 같은 실패 창이 떴습니다. Exit code (Decimal): -2068052377Error description: 잘못된 명령줄 인수입니다. 자세한 명령줄 도움말은 Windows Installer SDK를 참조하십시오. 선택했던 설치 유형은 기본이었습니다. 구글링 검색 결과 visual c++을 설치하라거나 레지스트리에 뭔가를 추가하라는 글도 눈에 띄었습니다. 하지만 일단 선택할 수 있는 범주 내에서 해결해..