본문으로 건너뛰기
IntoSQL 홈

SQLite에서 SQL Server로 변환

SQLite 데이터베이스 파일(.db, .sqlite, .sqlite3)이나 sqlite3의 .dump가 쓴 SQL을 놓으면, 같은 테이블, 키, 인덱스, 데이터를 담은 SQL Server 스크립트를 다운로드할 수 있어요. 각 열은 값이 들어가는 타입이 되고, SQL Server이(가) 그대로 담을 수 없는 값은 모두 보고서에 나와요.

내 파일
sqlshop_2024_sqlite.sql샘플 파일, 3.4kB
내 데이터베이스

18개 행 변환, 수정 없음, 거부 없음

보기

shop_2024_sqlite.sql의 테이블SQLite 덤프 · sqlite3(으)로 작성됨 · utf-8

  • customers8개 행
    7개 열
    idbigint not null
    namenvarchar(max) not null
    emailnvarchar(450) not null
    countrynvarchar(max) not null
    is_activebit not null
    signed_update
    created_atdatetime2(0) not null
  • orders10개 행
    9개 열
    idbigint not null
    customer_idbigint not null
    statusnvarchar(450) not null
    totaldecimal(10,2) not null
    itemsint not null
    ordered_atdatetime2(0) not null
    shipped_atdatetime2(0)
    notenvarchar(max)
    receiptvarbinary(max)

변환되지 않음

  • 뷰 order_totals
  • 트리거 orders_shipped

데이터베이스마다 이 객체를 자체 언어로 작성해요. SQL Server에 맞게 다시 작성하세요.

-- Written by IntoSQL from a SQLite dump. Load it with: sqlcmd -b -f 65001 -d <database> -i <file>
SET NOCOUNT ON;
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
SET ANSI_WARNINGS ON;
SET ARITHABORT ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET NUMERIC_ROUNDABORT OFF;
GO

CREATE TABLE [dbo].[customers] (
    [id] bigint IDENTITY(9, 1) NOT NULL,
    [name] nvarchar(max) COLLATE Latin1_General_100_BIN2 NOT NULL,
    [email] nvarchar(450) COLLATE Latin1_General_100_CI_AS_SC NOT NULL,
    [country] nvarchar(max) COLLATE Latin1_General_100_BIN2 DEFAULT N'US' NOT NULL,
    [is_active] bit DEFAULT 1 NOT NULL,
    [signed_up] date NULL,
    [created_at] datetime2(0) DEFAULT SYSDATETIME() NOT NULL,
    CONSTRAINT [PK_customers] PRIMARY KEY ([id])
);
GO

CREATE TABLE [dbo].[orders] (
    [id] bigint IDENTITY(11, 1) NOT NULL,
    [customer_id] bigint NOT NULL,
    [status] nvarchar(450) COLLATE Latin1_General_100_BIN2 DEFAULT N'pending' NOT NULL,
    [total] decimal(10,2) NOT NULL,
    [items] int DEFAULT 1 NOT NULL,
    [ordered_at] datetime2(0) NOT NULL,
    [shipped_at] datetime2(0) NULL,
    [note] nvarchar(max) COLLATE Latin1_General_100_BIN2 NULL,
    [receipt] varbinary(max) NULL,
    CONSTRAINT [check1] CHECK ([status] IN (N'pending', N'paid', N'shipped', N'cancelled')),
    CONSTRAINT [PK_orders] PRIMARY KEY ([id])
);
GO

SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(1,N'Ana Martínez',N'ana@example.com',N'MX',1,'2023-01-15','2023-01-15 10:24:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(2,N'Zoë Müller',N'zoe@example.de',N'DE',1,'2023-02-03','2023-02-03 08:11:42');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(3,N'José Peña',N'jose@example.es',N'ES',0,'2023-03-21','2023-03-21 19:05:17');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(4,N'李雷',N'lilei@example.cn',N'CN',1,'2023-05-09','2023-05-09 02:40:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(5,N'Noah O''Brien',N'noah@example.ie',N'IE',1,NULL,'2023-06-30 14:00:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(6,N'Amélie Laurent',N'amelie@example.fr',N'FR',1,'2024-01-02','2024-01-02 09:30:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(7,N'Ravi Patel',N'ravi@example.in',N'IN',0,'2024-02-29','2024-02-29 23:59:59');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(8,N'Sofia Rossi 🌻',N'sofia@example.it',N'IT',1,'2024-04-12','2024-04-12 12:12:12');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(1,1,N'shipped',129.9,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(2,2,N'paid',54,1,'2024-03-02 11:15:00',NULL,N'Gift wrap 🎁',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(3,1,N'cancelled',12.5,1,'2024-03-03 09:45:00',NULL,N'Customer changed their mind',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(4,4,N'shipped',980,12,'2024-03-05 02:10:00','2024-03-07 08:00:00',N'请小心轻放',0x25504446);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(5,5,N'pending',45.75,2,'2024-03-08 17:20:00',NULL,CAST(N'' AS nvarchar(max))+N'Leave at the door;'+NCHAR(10)+N'ring twice',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(6,6,N'shipped',310.4,5,'2024-03-10 13:00:00','2024-03-11 09:00:00',N'Fragile: "glass"',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(7,8,N'paid',76.2,2,'2024-03-11 18:45:00',NULL,NULL,NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(8,2,N'paid',19.99,1,'2024-03-12 08:00:00',NULL,N'Paid at the counter',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(9,3,N'shipped',64,2,'2024-03-14 15:30:00',NULL,N'Shipping date never recorded',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(10,7,N'paid',1499,1,'2024-03-15 21:05:00',NULL,N'C:\Users\ravi\invoice.pdf',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO

-- Indexes, foreign keys, counters and triggers, after the rows.
CREATE UNIQUE INDEX [email] ON [dbo].[customers] ([email]);
CREATE INDEX [idx_orders_customer] ON [dbo].[orders] ([customer_id]);
CREATE INDEX [idx_orders_status_date] ON [dbo].[orders] ([status], [ordered_at]);
ALTER TABLE [dbo].[orders] WITH NOCHECK ADD CONSTRAINT [FK_orders] FOREIGN KEY ([customer_id]) REFERENCES [dbo].[customers] ([id]) ON DELETE CASCADE;
BEGIN TRY ALTER TABLE [dbo].[orders] WITH CHECK CHECK CONSTRAINT [FK_orders]; END TRY BEGIN CATCH PRINT N'Foreign key ' + N'[FK_orders]' + N' has rows without a parent: it stays unchecked, and new rows are checked.'; END CATCH;
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[customers]); IF @next IS NOT NULL BEGIN IF @next < 8 SET @next = 8; DBCC CHECKIDENT (N'[dbo].[customers]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[orders]); IF @next IS NOT NULL BEGIN IF @next < 10 SET @next = 10; DBCC CHECKIDENT (N'[dbo].[orders]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
GO

수정 사항

수정할 부분이 없었어요.

확인 필요

  • 뷰, 트리거, 루틴, 이벤트 2개가 변환되지 않았어요. 보고서에 각각 나와 있어요. SQL Server에서 직접 다시 만드세요.
  • customers의 체크 제약 check1을(를) SQL Server용으로 쓸 수 없어(function char_length) 만들지 않았어요. 중요하다면 체크 제약을 직접 작성하세요.

파일은 이 컴퓨터에서 변환되고 업로드되지 않아요.

다른 샘플:

SQLite에서 SQL Server로 바뀌는 점

각 행은 변환기가 적용하는 규칙이며, 규칙이 데이터를 바꿀 때 보고서에 쓰는 줄이 함께 나와요.

  • declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)

    열의 모든 값이 들어가는 타입

    SQLite는 어떤 열에든 어떤 값이든 담으므로 선언된 타입은 힌트예요. 각 열은 모든 값이 들어가는 타입이 되고, 값이 섞인 열은 그 텍스트를 유지해요.

  • BOOLEAN, BOOL

    bit

    모든 값이 0 또는 1일 때예요. 다른 값도 담은 열은 그 값을 숫자나 텍스트로 유지해요.

  • TEXT, VARCHAR(n), CHAR(n), CLOB

    nvarchar(n) 또는 nvarchar(max)

    SQLite는 길이를 강제하지 않아요. 선언된 길이는 모든 값이 들어갈 때만 유지해요.

  • DECIMAL(p,s), NUMERIC

    모든 값이 들어가면 정확한 타입, 아니면 double

    SQLite는 이 값을 정수나 double로 저장해요. 선언된 정밀도는 값이 들어갈 때만 유지해요.

  • BLOB, and columns holding bytes

    varbinary(max)

    바이트는 바이트로 남아요. 같은 열에 있는 텍스트와 숫자는 그 바이트로 유지해요.

  • DATE, DATETIME, TIMESTAMP holding ISO 8601 text

    date, datetime2(p)

    모든 값이 날짜 또는 날짜와 시간일 때예요. 에포크 숫자와 다른 텍스트는 값을 그대로 유지해요.

  • JSON holding JSON text

    nvarchar(max)

    모든 값이 JSON 객체나 배열일 때예요.

  • Infinity in REAL columns

    NULL

    SQL Server의 double에는 무한대가 없어서 이 값은 NULL이 되고 보고서에 개수가 나와요.

    보고서 줄: invalid_value_null

  • INTEGER PRIMARY KEY, AUTOINCREMENT

    IDENTITY, 가장 큰 id 또는 sqlite_sequence 값 다음부터 이어짐

    정확히 INTEGER PRIMARY KEY로 선언된 열만 rowid예요. 모든 행은 id를 유지하고, 카운터는 지금까지 부여된 가장 큰 id 다음부터 시작해요.

  • COLLATE NOCASE

    대소문자를 구분하지 않는 콜레이션

    SQL Server의 일반적인 콜레이션은 모든 열에서 대소문자를 무시해요. NOCASE가 ASCII 문자에 대해 그랬던 것과 같아요.

  • generated columns

    계산 열, STORED이면 PERSISTED

    SQL Server도 같은 방식으로 계산해요.

  • generated columns with functions IntoSQL doesn't write, and the || operator

    일반 열

    쓸 수 없는 수식은 일반 열로 남고 보고서에 한 줄 기록돼요. 덤프에는 생성 열의 값이 없어요.

    보고서 줄: generated_not_translated

  • defaults with functions IntoSQL doesn't write (strftime, randomblob)

    기본값 없음

    쓸 수 없는 기본값은 제외하고 보고해요. CURRENT_TIMESTAMP와 datetime('now')는 써요.

    보고서 줄: default_not_translated

  • CHECK constraints

    변환됨

    같은 체크 제약이고, 각 행을 불러올 때 검사해요.

  • CHECK constraints with functions IntoSQL doesn't write

    만들지 않음

    쓸 수 없는 체크 제약은 제외하고 보고해요.

    보고서 줄: check_skipped

  • partial and expression indexes

    만들지 않음

    IntoSQL은 열 전체에 대한 인덱스를 써요. 다른 인덱스는 불러온 뒤 다시 만드세요.

    보고서 줄: index_skipped

  • foreign keys (unenforced unless PRAGMA foreign_keys=ON)

    데이터 뒤에 WITH NOCHECK로 만들고 검사

    SQLite는 지시받을 때만 외래 키를 검사하므로 부모 행이 없는 행이 흔해요. 그런 행도 불러오고, 불러오기를 멈추지 않고 경고와 함께 키를 검사하지 않은 상태로 남겨요.

  • ON DELETE or ON UPDATE that cascades in a cycle or along a second path

    NO ACTION

    SQL Server는 한 테이블에 두 번 도달할 수 있는 연쇄 동작을 거부해요.

    보고서 줄: foreign_key_action_dropped

  • VARCHAR(n) holding characters past U+FFFF (emoji)

    nvarchar(2n), 4000을 넘으면 nvarchar(max)

    nvarchar는 UTF-16 단위로 세고 이모지는 두 단위를 차지하므로, 열에 모든 값이 들어갈 공간을 줘요.

    보고서 줄: text_length_widened

  • foreign keys to tables the dump doesn't create

    만들지 않음

    키는 없는 테이블을 가리킬 수 없어요.

    보고서 줄: foreign_key_skipped

  • primary keys holding NULL, and NOT NULL columns with values that become NULL

    NOT NULL 제거

    SQLite에서는 rowid가 아닌 기본 키가 NULL을 담을 수 있어요. 대상에서 그 열은 NOT NULL일 수 없어요. 그러면 불러오기가 멈춰요.

    보고서 줄: not_null_relaxed

  • views, triggers and virtual tables (FTS, R*Tree)

    보고서에 나열

    코드는 SQLite의 자체 언어로 작성되고, 가상 테이블에는 SQLite의 모듈이 필요해요. 다시 만들 수 있도록 나열해요. 내부 테이블은 복사하지 않아요.

    보고서 줄: not_converted_objects

  • dumps without CREATE TABLE (--data-only)

    값으로 판단한 타입

    데이터만 있는 덤프에는 행만 있어서 타입을 값으로 판단하고 열에는 번호가 붙어요.

    보고서 줄: no_schema

  • expressions in INSERT values other than the text functions dumps write

    NULL

    unistr(), replace(), char(), ||는 셸이 쓰는 그대로 계산해요. 다른 식은 데이터베이스 없이 계산할 수 없어요.

    보고서 줄: expression_value

  • NUL characters in text

    유지

    sqlite3 셸과 Python은 덤프할 때 NUL 문자에서 텍스트를 잘라서, 덤프에는 그 앞부분만 들어 있어요.

  • text that isn't valid UTF-8

    잘못된 바이트를 대체 문자로

    덤프는 이런 텍스트를 원시 바이트로 써요. 스크립트는 UTF-8이에요.

    보고서 줄: invalid_utf8_replaced

  • text decoded twice (ñ)

    그대로 복사

    덤프에 정확히 이 문자들이 있으므로 그대로 복사하고, 보고서에서 알려 줘요.

    보고서 줄: mojibake_suspected

SQLite에서SQL Server에서보고서 줄
declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)열의 모든 값이 들어가는 타입SQLite는 어떤 열에든 어떤 값이든 담으므로 선언된 타입은 힌트예요. 각 열은 모든 값이 들어가는 타입이 되고, 값이 섞인 열은 그 텍스트를 유지해요.
BOOLEAN, BOOLbit모든 값이 0 또는 1일 때예요. 다른 값도 담은 열은 그 값을 숫자나 텍스트로 유지해요.
TEXT, VARCHAR(n), CHAR(n), CLOBnvarchar(n) 또는 nvarchar(max)SQLite는 길이를 강제하지 않아요. 선언된 길이는 모든 값이 들어갈 때만 유지해요.
DECIMAL(p,s), NUMERIC모든 값이 들어가면 정확한 타입, 아니면 doubleSQLite는 이 값을 정수나 double로 저장해요. 선언된 정밀도는 값이 들어갈 때만 유지해요.
BLOB, and columns holding bytesvarbinary(max)바이트는 바이트로 남아요. 같은 열에 있는 텍스트와 숫자는 그 바이트로 유지해요.
DATE, DATETIME, TIMESTAMP holding ISO 8601 textdate, datetime2(p)모든 값이 날짜 또는 날짜와 시간일 때예요. 에포크 숫자와 다른 텍스트는 값을 그대로 유지해요.
JSON holding JSON textnvarchar(max)모든 값이 JSON 객체나 배열일 때예요.
Infinity in REAL columnsNULLSQL Server의 double에는 무한대가 없어서 이 값은 NULL이 되고 보고서에 개수가 나와요.invalid_value_null
INTEGER PRIMARY KEY, AUTOINCREMENTIDENTITY, 가장 큰 id 또는 sqlite_sequence 값 다음부터 이어짐정확히 INTEGER PRIMARY KEY로 선언된 열만 rowid예요. 모든 행은 id를 유지하고, 카운터는 지금까지 부여된 가장 큰 id 다음부터 시작해요.
COLLATE NOCASE대소문자를 구분하지 않는 콜레이션SQL Server의 일반적인 콜레이션은 모든 열에서 대소문자를 무시해요. NOCASE가 ASCII 문자에 대해 그랬던 것과 같아요.
generated columns계산 열, STORED이면 PERSISTEDSQL Server도 같은 방식으로 계산해요.
generated columns with functions IntoSQL doesn't write, and the || operator일반 열쓸 수 없는 수식은 일반 열로 남고 보고서에 한 줄 기록돼요. 덤프에는 생성 열의 값이 없어요.generated_not_translated
defaults with functions IntoSQL doesn't write (strftime, randomblob)기본값 없음쓸 수 없는 기본값은 제외하고 보고해요. CURRENT_TIMESTAMP와 datetime('now')는 써요.default_not_translated
CHECK constraints변환됨같은 체크 제약이고, 각 행을 불러올 때 검사해요.
CHECK constraints with functions IntoSQL doesn't write만들지 않음쓸 수 없는 체크 제약은 제외하고 보고해요.check_skipped
partial and expression indexes만들지 않음IntoSQL은 열 전체에 대한 인덱스를 써요. 다른 인덱스는 불러온 뒤 다시 만드세요.index_skipped
foreign keys (unenforced unless PRAGMA foreign_keys=ON)데이터 뒤에 WITH NOCHECK로 만들고 검사SQLite는 지시받을 때만 외래 키를 검사하므로 부모 행이 없는 행이 흔해요. 그런 행도 불러오고, 불러오기를 멈추지 않고 경고와 함께 키를 검사하지 않은 상태로 남겨요.
ON DELETE or ON UPDATE that cascades in a cycle or along a second pathNO ACTIONSQL Server는 한 테이블에 두 번 도달할 수 있는 연쇄 동작을 거부해요.foreign_key_action_dropped
VARCHAR(n) holding characters past U+FFFF (emoji)nvarchar(2n), 4000을 넘으면 nvarchar(max)nvarchar는 UTF-16 단위로 세고 이모지는 두 단위를 차지하므로, 열에 모든 값이 들어갈 공간을 줘요.text_length_widened
foreign keys to tables the dump doesn't create만들지 않음키는 없는 테이블을 가리킬 수 없어요.foreign_key_skipped
primary keys holding NULL, and NOT NULL columns with values that become NULLNOT NULL 제거SQLite에서는 rowid가 아닌 기본 키가 NULL을 담을 수 있어요. 대상에서 그 열은 NOT NULL일 수 없어요. 그러면 불러오기가 멈춰요.not_null_relaxed
views, triggers and virtual tables (FTS, R*Tree)보고서에 나열코드는 SQLite의 자체 언어로 작성되고, 가상 테이블에는 SQLite의 모듈이 필요해요. 다시 만들 수 있도록 나열해요. 내부 테이블은 복사하지 않아요.not_converted_objects
dumps without CREATE TABLE (--data-only)값으로 판단한 타입데이터만 있는 덤프에는 행만 있어서 타입을 값으로 판단하고 열에는 번호가 붙어요.no_schema
expressions in INSERT values other than the text functions dumps writeNULLunistr(), replace(), char(), ||는 셸이 쓰는 그대로 계산해요. 다른 식은 데이터베이스 없이 계산할 수 없어요.expression_value
NUL characters in text유지sqlite3 셸과 Python은 덤프할 때 NUL 문자에서 텍스트를 잘라서, 덤프에는 그 앞부분만 들어 있어요.
text that isn't valid UTF-8잘못된 바이트를 대체 문자로덤프는 이런 텍스트를 원시 바이트로 써요. 스크립트는 UTF-8이에요.invalid_utf8_replaced
text decoded twice (ñ)그대로 복사덤프에 정확히 이 문자들이 있으므로 그대로 복사하고, 보고서에서 알려 줘요.mojibake_suspected

스크립트를 SQL Server에 불러오기

스크립트는 테이블을 만들고 행을 복사한 다음 키, 인덱스, 외래 키를 추가해요. 그래서 빨리 불러오고 첫 오류에서 멈춰요.

sqlcmd -b -f 65001 -S localhost -d mydb -i sqlite.sql_server.sql

외래 키는 WITH NOCHECK로 추가한 다음 검사해요. 어떤 행이 존재하지 않는 행을 가리키면, 중간에 실패하지 않고 어떤 제약인지 알려 주고 그 제약은 검사하지 않은 채로 남겨요.

큰 덤프는 서버와 같은 컴퓨터에서 sqlcmd를 실행하세요. 최대 1000행의 배치마다 따로 커밋하므로 트랜잭션 로그가 작게 유지돼요.

좋은 결과를 위한 SQLite 덤프 방법

변환기는 덤프에 담긴 내용을 읽어요. 다음 옵션을 쓰면 더 많은 데이터가 덤프에 남아요:

  • 데이터베이스 파일 자체를 그대로 변환하며, 브라우저에서 페이지 단위로 읽어요. 변경 사항이 -wal 파일에 남지 않도록 먼저 파일에 쓰고 있는 앱을 닫으세요.
  • sqlite3 app.db .dump > app.sql은 같은 데이터베이스를 SQL로 써요. 이 SQL도 .sql 또는 .sql.gz로 변환돼요.
  • DB Browser for SQLite에서는 File, Export, Database to SQL file 순서로 선택하면 그 SQL을 써요. Python의 iterdump()도 마찬가지예요.

변환되지 않는 것

뷰와 트리거는 SQLite의 자체 언어로 작성돼요. 보고서에 이름으로 나열되고 몰래 빠지는 일은 없으므로, SQL Server에 맞게 다시 작성할 수 있어요. FTS5와 R*Tree 같은 가상 테이블도 나열되고, 그 섀도 테이블은 제외돼요.

SQLite에서 SQL Server로 변환에 관한 질문

여기에 답이 없나요? 문의 페이지로 연락하시면 담당자가 답장해요. 문의 페이지

덤프가 업로드되나요?

아니요. 변환기는 브라우저에서 실행되고 디스크의 덤프를 조각조각 읽으므로, 덤프가 컴퓨터 밖으로 나가지 않아요. 데스크톱 앱과 명령줄도 컴퓨터에서 변환해요.

덤프는 얼마나 커도 되나요?

변환기는 덤프 전체를 메모리에 올리지 않아요. 파일을 범위별로 두 번 읽고, 읽는 대로 스크립트를 써요. 수 GB 덤프도 브라우저, 데스크톱 앱, 명령줄에서 변환돼요.

.db 파일 자체를 변환할 수 있나요?

네. .db, .sqlite 또는 .sqlite3 파일을 놓으세요. 브라우저에서 읽고 업로드하지 않아요. NUL 문자가 든 텍스트와 double 값의 모든 자릿수가 저장된 그대로 들어오며, .dump에서는 이 부분이 잘릴 수 있어요.

어떤 SQLite 버전의 덤프를 읽나요?

SQLite 3.0 이상의 UTF-8 또는 UTF-16 데이터베이스 파일과, sqlite3 셸의 .dump나 Python의 iterdump()로 만든 덤프예요. 모든 테스트 파일과 덤프는 sqlite3 3.31부터 3.54까지에서 만들고, STRICT와 WITHOUT ROWID 테이블을 포함해 원본과 셀 단위로 비교해요.

SQLite이(가) 타입을 강제하지 않을 때 열 타입은 어떻게 정해지나요?

선언된 타입은 힌트이고 값이 결정해요. 모든 값이 들어가면 열은 bigint, decimal, float, date, datetime2, bit, varbinary, nvarchar 중 하나가 돼요. 텍스트는 SQLite처럼 정확히 비교하고, COLLATE NOCASE 열은 대소문자를 무시하고 비교해요.

INTEGER PRIMARY KEY와 AUTOINCREMENT는 유지되나요?

네. INTEGER PRIMARY KEY는 IDENTITY 열이 되고, 모든 행은 id를 유지해요. 다음 id는 가장 큰 id 다음부터, AUTOINCREMENT가 있으면 sqlite_sequence 값 다음부터 이어져요.

뷰와 트리거는 어떻게 되나요?

데이터베이스마다 자체 언어로 작성하므로 변환하지 않고 보고서에 이름으로 나열해요.

스크립트는 어떤 SQL Server 버전에서 불러올 수 있나요?

SQL Server 2017부터 2025까지예요. 같은 스크립트를 각 버전에서 불러오며, 문제가 생기면 첫 오류에서 멈춰요.