====== MS SQL Server ======
* [[mssqlserver:basic|MS SqlServer basic]]
* [[mssqlserver:jdbc|MS SQL Server JDBC]]
* [[java:hibernate:mssqlserver|Hibernate & MS SQL Server]]
* [[mssqlserver:querystore|SQLServer Query Store]]
* [[mssqlserver:performance|SQLServer Performance]]
* [[https://docs.microsoft.com/ko-kr/sql/sql-operations-studio/what-is?view=sql-server-2017|SQL Operations Studio]]
===== SQLServer 2012 Express 설치 =====
* 파일 다운로드
wget http://download.microsoft.com/download/8/D/D/8DD7BDBA-CEF7-4D8E-8C16-D9F69527F909/ENU/x64/SQLEXPRWT_x64_ENU.exe -Outfile SQLEXPRWT_x64_ENU.exe
* Port 변경 및 활성화 : [[https://docs.microsoft.com/ko-kr/sql/database-engine/configure-windows/configure-a-server-to-listen-on-a-specific-tcp-port?view=sql-server-2017|특정 TCP 포트에서 수신 대기하도록 서버 구성 | Microsoft Docs]]
* SQL Server Configuration Manager 실행
* SQL Server Network Configuration 에서 원하는 인스턴스 선택
* **TCP/IP** ''Enabled''로 변경. 속성 선택해서 원하는 IP에 대해 Port 지정. 0으로 돼 있는 것은 삭제.
{{::sqlserver_port.png|}}
* Service 에서 해당 인스턴스 재시작
===== 2017 Linuix 버전 설치 =====
* 2017 버전부터 Linux 지원
* [[https://docs.microsoft.com/ko-kr/sql/linux/sql-server-linux-overview?view=sql-server-linux-2017|SQL Server on Linux 개요 | Microsoft Docs]]
* [[https://docs.microsoft.com/ko-kr/sql/linux/sql-server-linux-configure-docker?view=sql-server-ver15|Docker의 SQL Server 구성 옵션 - SQL Server | Microsoft Docs]]
* [[https://docs.microsoft.com/ko-kr/sql/linux/quickstart-install-connect-docker?view=sql-server-linux-2017|Docker에서 SQL Server 2017 시작 | Microsoft Docs]] [[https://hub.docker.com/r/microsoft/mssql-server-linux/|microsoft/mssql-server-linux - Docker Hub]]
* Docker ''localhost:1433''
* username: ''sa''
* password: ''password12!''
sudo docker run -e 'ACCEPT_EULA=Y' \
-e 'MSSQL_SA_PASSWORD=password12!' \
-e 'TZ=Asia/Seoul' \
-p 1433:1433 --name sqlserver2017 \
-d microsoft/mssql-server-linux:2017-latest
# TZ=Asia/Seoul 은 운영체제 시간은 그대로인 상태로 sqlserver의 시간대만 Asia/Seoul로 변경한다.
# 완성형 필요하면 추가 옵션
-e 'MSSQL_COLLATION=Korean_Wansung_CI_AS'
* 만약 실행 초반에 Timezone 설정을 못했다면 - ''Asia/Seoul''로 시간대를 지정해야 한다.
docker exec sqlserver2017 /bin/bash -c "apt-get update && apt-get -y install tzdata && ln -snf /usr/share/zoneinfo/Asia/Seoul /etc/localtime && echo 'Asia/Seoul' > /etc/timezone"
docker restart sqlserver2017
* Docker 사용시 특히 Mac, Windows 에서는 Docker에 할당된 메모리가 4GB 이상인지 확인해야 한다.
* Windows CMD에서 실행하지 말고 파워셸에서 실행할 것.
* 아래와 같은 오류가 발생하면(특히 Windows, Mac OS X) Docker 자체를 재시작하거나 안되면 PC를 재시작할 것
Unable to acquire SQL Server application lock
---------------------------------------------
SQL State : S0000
Error Code : 17750
Message : Could not load the DLL (server internal), or one of the DLLs it references. Reason: 126(The specified module could not be found.).
Could not load the DLL (server internal), or one of the DLLs it references. Reason: 126(The specified module could not be found.).
* 그 외버전을 Docker 로 접속가능하게 [[https://windocks.com/|Windocks]]
# 한번에
docker exec -it sqlserver2017 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'password12!'
# docker 내부에서 command line 으로 DB접속
docker exec -it sqlserver2017 "bash"
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'password12!'
* ''sqlcmd''에서 port 지정은 ''-S localhost,1433'' 처럼 Hostname 뒤에 쉼표로 한다.
===== Vagrant로 SQLServer 설치하기 =====
* [[https://libraries.io/github/mince27/vagrant-mssql-express|Vagrant로 MS SQLServer Express 2012 설치]] [[https://github.com/kwon37xi/vagrant-mssql-express|Github]]
git clone https://github.com/kwon37xi/vagrant-mssql-express.git
cd vagrant-mssql-express
vagrant up
* DB 접속정보
* IP/HOST : ''192.168.50.4'' ''localhost''로 포트포워딩해서 접속 가능
* Username: ''sa''
* Password: ''password12!''
* ''install-sql-server.cmd'' 수정해서 변경가능
* rdp
* 먼저 ''apt-get install rdesktop''
* ''vagrant rdp'' 실행
* Username: ''vagrant''
* Password: ''vagrant''
* 그외 [[https://helabs.com/artigos/2014/09/19/mssql-on-vagrant/|Microsoft SQL Server on Vagrant - Blog do Time]]
===== SQL log =====
현재 DB에서 실행된 실제 SQL 문을 보고 싶다면 [[http://www.jochenhebbrecht.be/site/2013-03-30/database/logging-all-queries-executed-mssql-database|Logging all queries executed on MSSQL database | ..:: JOCHEN HEBBRECHT ::..]]
SELECT SQLTEXT.text, STATS.last_execution_time
FROM sys.dm_exec_query_stats STATS
CROSS APPLY sys.dm_exec_sql_text(STATS.sql_handle) AS SQLTEXT
WHERE STATS.last_execution_time > GETDATE()-1
ORDER BY STATS.last_execution_time DESC
===== Apply =====
* [[https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/|SQL Server CROSS APPLY and OUTER APPLY]]
* [[https://technet.microsoft.com/ko-kr/library/ms175156(v=sql.105).aspx|APPLY 사용]]
* [[http://nexondbteam.tistory.com/80|데이터베이스 :: APPLY 연산자 소개 및 사례 공유 (게시물 리스트 화면에서 각 게시물별 최근 댓글 3개씩 가져오기)]]
===== DROP TABLE IF EXISTS =====
* [[https://stackoverflow.com/questions/7887011/how-to-drop-a-table-if-it-exists-in-sql-server|How to drop a table if it exists in SQL Server? - Stack Overflow]]
==== 2016 이전 버전 및 SQL 표준 방법 ====
IF EXISTS (SELECT * FROM [CATALOG_NAME].INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='[TABLE_NAME]' AND TABLE_SCHEMA='dbo')
DROP TABLE [CATALOG_NAME].dbo.[TABLE_NAME];
==== 2016 이후 버전 ====
DROP TABLE IF EXISTS [CATALOG_NAME].dbo.[TABLE_NAME];
==== varchar vs nvarchar ====
* [[https://stackoverflow.com/questions/144283/what-is-the-difference-between-varchar-and-nvarchar|sql server - What is the difference between varchar and nvarchar? - Stack Overflow]]
* ''varchar'' : 8bit(1byte) 단위로 문자를 저장한다.
* ''nvarchar'' : unicode 로 문자를 저장한다. 한글 한글자 '한'은 length가 1이 된다. 그러나 실제 저장소는 16bit(2byte)를 차지한다.
* **가능하면 ''nvarchar''로 통일하는게 좋다.** 그렇지 않고 두가지가 섞일 경우 매우 복잡한 byte 조작이 필요해진다.
==== datetime / datetime2 ====
* [[https://stackoverflow.com/questions/1334143/datetime2-vs-datetime-in-sql-server|DateTime2 vs DateTime in SQL Server - Stack Overflow]]
* ''datetime2''를 사용할 것! 더 적은 용량 더 높은 정확도.
===== INSERT =====
* INSERT 를 할 때 AUTO INCREMENT PK를 직접 지정하고 싶다면 ''IDENTITY_INSERT''를 지정해야 한다.
SET IDENTITY_INSERT books ON;
// books table에 insert
SET IDENTITY_INSERT books OFF;
===== 실습용 데이터베이스 =====
* [[https://github.com/Microsoft/sql-server-samples|SQL-Server Samples]] [[https://github.com/Microsoft/sql-server-samples/releases|Releases]]
* 특히 ''Adventure Works'' 샘플을 사용할 것.
===== 참고 =====
* [[https://www.mssqltips.com/sqlservertip/4322/sql-server-differences-of-char-nchar-varchar-and-nvarchar-data-types/|SQL Server differences of char, nchar, varchar and nvarchar data types]]
* [[https://blogs.msdn.microsoft.com/qingsongyao/2009/04/10/sql-server-and-utf-8-encoding-1-true-or-false/|SQL Server and UTF-8 Encoding (1) -True or False – Collation, DateTime, SParse Column and XML]]
* [[https://docs.microsoft.com/ko-kr/sql/powershell/download-sql-server-ps-module?toc=/sql/ssms/toc.json&view=sql-server-2017|SQL Server PowerShell 모듈 다운로드]]
* [[https://docs.microsoft.com/ko-kr/sql/ssms/sql-server-management-studio-ssms?view=sql-server-2017|SSMS(SQL Server Management Studio)]]
* [[https://www.youtube.com/playlist?list=PL08903FB7ACA1C2FB|SQL Server tutorial for beginners - YouTube]]