SQL Server 스크립트를 이전 또는 최신 SQL Server로 옮기기
SSMS 스크립트 생성이 스키마와 데이터로 쓴 스크립트(.sql 또는 .sql.gz, UTF-16 또는 UTF-8)를 놓으면, 어느 버전이 썼든 SQL Server 2017~2025에서 불러와지는 스크립트를 받아요. IDENTITY, 콜레이션, xml과 hierarchyid 같은 타입은 그대로이고, 모든 변경은 보고서에 나와요.
18개 행 변환, 수정 1개, 거부 없음
shop_2024_sqlserver.sql의 테이블SQL Server 덤프 · SQL Server Management Objects(으)로 작성됨 · utf-8
orders10개 행
11개 열 id int not null customer_id int not null status nvarchar(10) not null total decimal(19,4) not null items tinyint not null ordered_at datetime2(0) not null shipped_at datetime2(7) note nvarchar(max) details nvarchar(max) order_ref uniqueidentifier not null total_with_tax decimal(12,2) customers8개 행1
8개 열 id int not null name nvarchar(100) not null email nvarchar(200) not null country nchar(2) not null is_active bit not null signed_up date created_at datetimeoffset(0) not null row_version binary(8)
변환되지 않음
- 뷰 paid_orders
- 트리거 orders_no_negative
데이터베이스마다 이 객체를 자체 언어로 작성해요. SQL Server에 맞게 다시 작성하세요.
-- Written by IntoSQL from a SQL Server 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].[orders] (
[id] int IDENTITY(1, 1) NOT NULL,
[customer_id] int NOT NULL,
[status] nvarchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS DEFAULT N'pending' NOT NULL,
[total] decimal(19,4) NOT NULL,
[items] tinyint DEFAULT 1 NOT NULL,
[ordered_at] datetime2(0) NOT NULL,
[shipped_at] datetime2(7) NULL,
[note] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[details] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[order_ref] uniqueidentifier DEFAULT (NEWID()) NOT NULL,
[total_with_tax] AS CAST((CAST([total] * (1.16) AS decimal(12,2))) AS decimal(12,2)) PERSISTED,
CONSTRAINT [check2] CHECK ([status] = N'cancelled' OR [status] = N'shipped' OR [status] = N'paid' OR [status] = N'pending'),
CONSTRAINT [check3] CHECK ([total] >= (0)),
CONSTRAINT [PK_orders] PRIMARY KEY ([id])
);
GO
CREATE TABLE [dbo].[customers] (
[id] int IDENTITY(1, 1) NOT NULL,
[name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[email] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[country] nchar(2) COLLATE SQL_Latin1_General_CP1_CI_AS DEFAULT N'US' NOT NULL,
[is_active] bit DEFAULT 1 NOT NULL,
[signed_up] date NULL,
[created_at] datetimeoffset(0) DEFAULT SYSDATETIMEOFFSET() NOT NULL,
[row_version] binary(8) NULL,
CONSTRAINT [PK_customers] 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-15T04:24:00.0000000-06: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-03T09:11:42.0000000+01: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
(3,N'José Peña',N'jose@example.es',N'ES',0,'2023-03-21','2023-03-21T20:05:17.0000000+01: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
(4,N'李雷',N'lilei@example.cn',N'CN',1,'2023-05-09','2023-05-09T10:40:00.0000000+08: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-30T15:00:00.0000000+01: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-02T10:30:00.0000000+01: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-03-01T05:29:59.0000000+05:30');
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-12T14:12:12.0000000+02:00');
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], [details], [order_ref]) VALUES
(1,1,N'shipped',129.9000,3,'2024-03-01T10:00:00.0000000','2024-03-02T16:30:00.1234567',NULL,N'{"gift": false}',N'0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f');
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], [details], [order_ref]) VALUES
(2,2,N'paid',54.0000,1,'2024-03-02T11:15:00.0000000',NULL,N'Gift wrap 🎁',N'{"gift": true, "wrap": "red"}',N'1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70');
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], [details], [order_ref]) VALUES
(3,1,N'cancelled',12.5000,1,'2024-03-03T09:45:00.0000000',NULL,N'Customer changed their mind',NULL,N'2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081');
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], [details], [order_ref]) VALUES
(4,4,N'shipped',980.0000,12,'2024-03-05T02:10:00.0000000','2024-03-07T08:00:00.0000000',N'请小心轻放',N'{"fragile": true}',N'3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192');
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], [details], [order_ref]) VALUES
(5,5,N'pending',45.7500,2,'2024-03-08T17:20:00.0000000',NULL,N'Leave at the door; ring twice',NULL,N'4f1e806c-7d5b-4c2e-9a99-5e6f708192a3');
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], [details], [order_ref]) VALUES
(6,6,N'shipped',310.4000,5,'2024-03-10T13:00:00.0000000','2024-03-11T09:00:00.0000000',N'Fragile: "glass"',N'{"fragile": true}',N'50f2917d-8e6c-4d3f-8baa-6f708192a3b4');
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], [details], [order_ref]) VALUES
(7,8,N'paid',76.2000,2,'2024-03-11T18:45:00.0000000',NULL,NULL,NULL,N'6103a28e-9f7d-4e40-9cbb-708192a3b4c5');
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], [details], [order_ref]) VALUES
(8,2,N'shipped',19.9900,1,'2024-03-12T08:00:00.0000000','9999-12-31T23:59:59.9999999',N'Shipped date set to the maximum by an old import',NULL,N'7214b39f-a08e-4f51-8dcc-8192a3b4c5d6');
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], [details], [order_ref]) VALUES
(9,3,N'shipped',64.0000,2,'2024-03-14T15:30:00.0000000','2024-03-15T10:00:00.0000000',N'Two parcels',N'{"parcels": [1, 2]}',N'8325c4a0-b19f-4062-9edd-92a3b4c5d6e7');
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], [details], [order_ref]) VALUES
(10,7,N'paid',1499.0000,1,'2024-03-15T21:05:00.0000000',NULL,N'C:\Users\ravi\invoice.pdf',NULL,N'9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8');
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
-- Indexes, foreign keys, counters and triggers, after the rows.
CREATE INDEX [idx_orders_customer] ON [dbo].[orders] ([customer_id]);
CREATE INDEX [idx_orders_status_date] ON [dbo].[orders] ([status], [ordered_at]);
CREATE UNIQUE INDEX [email] ON [dbo].[customers] ([email]);
ALTER TABLE [dbo].[orders] WITH NOCHECK ADD CONSTRAINT [FK_orders] FOREIGN KEY ([customer_id]) REFERENCES [dbo].[customers] ([id]);
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].[orders]); IF @next IS NOT NULL BEGIN IF @next < 0 SET @next = 0; DBCC CHECKIDENT (N'[dbo].[orders]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[customers]); IF @next IS NOT NULL BEGIN IF @next < 0 SET @next = 0; DBCC CHECKIDENT (N'[dbo].[customers]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = N'People who bought at least once', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'customers';
GO
수정 사항
- customers의 "row_version" 열은 SQL Server가 자동으로 설정하는 행 버전이에요. 덤프에 그 값이 없어서 binary(8)(으)로 바꾸고 비워 둬요.
확인 필요
- 뷰, 트리거, 루틴, 이벤트 2개가 변환되지 않았어요. 보고서에 각각 나와 있어요. SQL Server에서 직접 다시 만드세요.
- orders의 체크 제약 check1을(를) SQL Server용으로 쓸 수 없어(function isjson) 만들지 않았어요. 중요하다면 체크 제약을 직접 작성하세요.
- orders의 인덱스 idx_orders_pending은(는) SQL Server용으로 쓸 수 없는 식을 사용해서(an index on an expression) 만들지 않았어요. 쿼리에 필요하면 인덱스를 직접 만드세요.
파일은 이 컴퓨터에서 변환되고 업로드되지 않아요.
다른 샘플:
파일과 스크립트에서 바뀌는 점
각 행은 변환기가 적용하는 규칙이며, 규칙이 데이터를 바꿀 때 보고서에 쓰는 줄이 함께 나와요.
bit
bit
같은 타입이에요.
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text, ntext
nchar(n), nvarchar(n), nvarchar(max), 각 열의 콜레이션 유지
nvarchar는 varchar 열의 코드 페이지와 상관없이 모든 문자를 담아요. SQL Server 2017에 없는 UTF-8 콜레이션은 대응하는 Unicode 콜레이션이 돼요.
column collations
각 열에 같은 콜레이션
열은 전과 같이 비교하고 정렬하며, 고유 키도 같은 행을 구분해요.
decimal(p,s), money, smallmoney
decimal(p,s), money는 decimal(19,4)
모든 자릿수를 유지하고, money는 소수 4자리 그대로예요.
datetime, datetime2, smalldatetime
datetime2(p)
datetime2는 datetime과 smalldatetime의 모든 값을 1년부터 같은 정밀도로 담아요.
datetimeoffset
datetimeoffset, 각 값의 오프셋 유지
같은 타입과 값이에요.
time
time(p)
같은 타입이에요.
dates that aren't valid
NULL
날짜가 아닌 값은 NULL이 되고 보고서에 개수가 나와요.
보고서 줄: date_out_of_range
json (SQL Server 2025)
nvarchar(max)
같은 JSON 값이고, SQL Server의 JSON 함수로 읽을 수 있어요.
uniqueidentifier
uniqueidentifier
같은 타입이에요.
binary, varbinary, image
binary(n), varbinary(n), varbinary(max)
바이트는 바이트 그대로 남아요.
xml, sql_variant, hierarchyid, geometry, geography
같은 타입
SQL Server 자체 타입은 유지해요. sql_variant 값은 텍스트를 유지하므로 기본 타입은 nvarchar가 돼요.
rowversion, timestamp
binary(8), 빈 값
rowversion 열은 복사한 행을 받을 수 없고, SSMS도 그 값을 스크립트에 넣지 않아요. 필요하면 불러온 뒤 다시 추가하세요.
보고서 줄: rowversion_empty
IDENTITY
IDENTITY, 가장 큰 id 다음부터 이어짐
복사한 id는 IDENTITY_INSERT로 불러오고, 카운터는 가장 큰 id 다음부터 이어져요.
CREATE SEQUENCE
같은 옵션의 CREATE SEQUENCE
SQL Server 시퀀스도 같은 방식으로 동작해요. SSMS는 시퀀스가 어디까지 진행했는지 스크립트에 넣지 않으므로, 만들 때의 값부터 시작해요.
computed columns
같은 계산 열, 원본처럼 PERSISTED
같은 수식이고, 대상에서 계산해요.
computed columns with functions IntoSQL doesn't write
일반 열
쓸 수 없는 수식은 일반 열로 남고 보고서에 한 줄 기록돼요. SSMS는 계산 열의 값을 스크립트에 넣지 않아요.
보고서 줄: generated_not_translated
defaults with functions IntoSQL doesn't write, and NEXT VALUE FOR
기본값 없음
쓸 수 없는 기본값은 제외하고 보고해요.
보고서 줄: default_not_translated
CHECK constraints
변환됨
같은 체크 제약이고, 각 행을 불러올 때 검사해요.
CHECK constraints with functions IntoSQL doesn't write
만들지 않음
쓸 수 없는 체크 제약은 제외하고 보고해요.
보고서 줄: check_skipped
CHECK constraints added WITH NOCHECK or disabled
만들지 않음
SQL Server가 이 체크 제약을 적용하지 않으므로 행이 이를 위반할 수 있어요.
보고서 줄: check_not_enforced
filtered and columnstore indexes
만들지 않음
IntoSQL은 열 전체에 대한 b-tree 인덱스를 써요. 다른 인덱스는 불러온 뒤 다시 만드세요.
보고서 줄: index_skipped
foreign keys
데이터 뒤에 WITH NOCHECK로 만들고, 고아 행은 경고와 함께 검사
키는 행 다음에 만들고 마지막에 검사해요. 부모 행이 없는 행이 있으면 불러오기를 멈추지 않고 경고와 함께 검사하지 않은 상태로 남겨요.
ON DELETE or ON UPDATE that cascades in a cycle or along a second path
NO ACTION
SQL Server는 이런 연쇄 동작을 거부하므로 덤프에 들어 있을 수 없어요. 이 행은 직접 편집한 스크립트를 위한 것이에요.
보고서 줄: foreign_key_action_dropped
foreign keys to tables the dump doesn't create
만들지 않음
키는 없는 테이블을 가리킬 수 없어요.
보고서 줄: foreign_key_skipped
tables on a partition scheme
모든 파티션의 행을 담은 하나의 테이블
행은 같아요. 필요하면 SQL Server에서 테이블을 다시 파티션으로 나누세요.
보고서 줄: partitions_dropped
temporal tables (SYSTEM_VERSIONING)
두 테이블: 현재 행과 기록
테이블과 그 기록 테이블은 일반 테이블로 복사돼요. 연결하려면 SYSTEM_VERSIONING을 다시 켜세요.
보고서 줄: system_versioning_dropped
NOT NULL columns with values that become NULL
NOT NULL 제거
값을 NULL로 바꿔야 했던 열은 NOT NULL을 유지할 수 없어요. 유지하면 불러오기가 멈춰요.
보고서 줄: not_null_relaxed
views, functions, procedures, triggers, synonyms, types and partition functions
보고서에 나열
IntoSQL은 테이블과 그 행을 변환해요. 나머지는 원래 스크립트에서 다시 만들 수 있도록 나열해요.
보고서 줄: not_converted_objects
scripts without CREATE TABLE (data only)
값으로 판단한 타입
데이터만 있는 스크립트에는 행만 있어서 타입을 값으로 판단해요.
보고서 줄: no_schema
expressions in INSERT values
NULL
데이터베이스를 실행하지 않는 변환기는 이 식을 계산할 수 없어요.
보고서 줄: expression_value
types IntoSQL doesn't know
nvarchar(max)
텍스트는 어떤 값이든 담아요. 불러온 뒤 타입을 바꾸세요.
보고서 줄: unknown_type
NUL characters in text
유지
nvarchar는 NUL 문자를 담을 수 있어서 값을 그대로 복사해요.
text that isn't valid in its encoding
잘못된 바이트를 대체 문자로
스크립트는 UTF-8이므로 모든 값이 올바른 텍스트여야 해요.
보고서 줄: invalid_utf8_replaced
text decoded twice (ñ)
그대로 복사
스크립트에 정확히 이 문자들이 있으므로 그대로 복사하고, 보고서에서 알려 줘요.
보고서 줄: mojibake_suspected
| 파일에서 | 스크립트에서 | 보고서 줄 |
|---|---|---|
| bit | bit같은 타입이에요. | |
| char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text, ntext | nchar(n), nvarchar(n), nvarchar(max), 각 열의 콜레이션 유지nvarchar는 varchar 열의 코드 페이지와 상관없이 모든 문자를 담아요. SQL Server 2017에 없는 UTF-8 콜레이션은 대응하는 Unicode 콜레이션이 돼요. | |
| column collations | 각 열에 같은 콜레이션열은 전과 같이 비교하고 정렬하며, 고유 키도 같은 행을 구분해요. | |
| decimal(p,s), money, smallmoney | decimal(p,s), money는 decimal(19,4)모든 자릿수를 유지하고, money는 소수 4자리 그대로예요. | |
| datetime, datetime2, smalldatetime | datetime2(p)datetime2는 datetime과 smalldatetime의 모든 값을 1년부터 같은 정밀도로 담아요. | |
| datetimeoffset | datetimeoffset, 각 값의 오프셋 유지같은 타입과 값이에요. | |
| time | time(p)같은 타입이에요. | |
| dates that aren't valid | NULL날짜가 아닌 값은 NULL이 되고 보고서에 개수가 나와요. | date_out_of_range |
| json (SQL Server 2025) | nvarchar(max)같은 JSON 값이고, SQL Server의 JSON 함수로 읽을 수 있어요. | |
| uniqueidentifier | uniqueidentifier같은 타입이에요. | |
| binary, varbinary, image | binary(n), varbinary(n), varbinary(max)바이트는 바이트 그대로 남아요. | |
| xml, sql_variant, hierarchyid, geometry, geography | 같은 타입SQL Server 자체 타입은 유지해요. sql_variant 값은 텍스트를 유지하므로 기본 타입은 nvarchar가 돼요. | |
| rowversion, timestamp | binary(8), 빈 값rowversion 열은 복사한 행을 받을 수 없고, SSMS도 그 값을 스크립트에 넣지 않아요. 필요하면 불러온 뒤 다시 추가하세요. | rowversion_empty |
| IDENTITY | IDENTITY, 가장 큰 id 다음부터 이어짐복사한 id는 IDENTITY_INSERT로 불러오고, 카운터는 가장 큰 id 다음부터 이어져요. | |
| CREATE SEQUENCE | 같은 옵션의 CREATE SEQUENCESQL Server 시퀀스도 같은 방식으로 동작해요. SSMS는 시퀀스가 어디까지 진행했는지 스크립트에 넣지 않으므로, 만들 때의 값부터 시작해요. | |
| computed columns | 같은 계산 열, 원본처럼 PERSISTED같은 수식이고, 대상에서 계산해요. | |
| computed columns with functions IntoSQL doesn't write | 일반 열쓸 수 없는 수식은 일반 열로 남고 보고서에 한 줄 기록돼요. SSMS는 계산 열의 값을 스크립트에 넣지 않아요. | generated_not_translated |
| defaults with functions IntoSQL doesn't write, and NEXT VALUE FOR | 기본값 없음쓸 수 없는 기본값은 제외하고 보고해요. | default_not_translated |
| CHECK constraints | 변환됨같은 체크 제약이고, 각 행을 불러올 때 검사해요. | |
| CHECK constraints with functions IntoSQL doesn't write | 만들지 않음쓸 수 없는 체크 제약은 제외하고 보고해요. | check_skipped |
| CHECK constraints added WITH NOCHECK or disabled | 만들지 않음SQL Server가 이 체크 제약을 적용하지 않으므로 행이 이를 위반할 수 있어요. | check_not_enforced |
| filtered and columnstore indexes | 만들지 않음IntoSQL은 열 전체에 대한 b-tree 인덱스를 써요. 다른 인덱스는 불러온 뒤 다시 만드세요. | index_skipped |
| foreign keys | 데이터 뒤에 WITH NOCHECK로 만들고, 고아 행은 경고와 함께 검사키는 행 다음에 만들고 마지막에 검사해요. 부모 행이 없는 행이 있으면 불러오기를 멈추지 않고 경고와 함께 검사하지 않은 상태로 남겨요. | |
| ON DELETE or ON UPDATE that cascades in a cycle or along a second path | NO ACTIONSQL Server는 이런 연쇄 동작을 거부하므로 덤프에 들어 있을 수 없어요. 이 행은 직접 편집한 스크립트를 위한 것이에요. | foreign_key_action_dropped |
| foreign keys to tables the dump doesn't create | 만들지 않음키는 없는 테이블을 가리킬 수 없어요. | foreign_key_skipped |
| tables on a partition scheme | 모든 파티션의 행을 담은 하나의 테이블행은 같아요. 필요하면 SQL Server에서 테이블을 다시 파티션으로 나누세요. | partitions_dropped |
| temporal tables (SYSTEM_VERSIONING) | 두 테이블: 현재 행과 기록테이블과 그 기록 테이블은 일반 테이블로 복사돼요. 연결하려면 SYSTEM_VERSIONING을 다시 켜세요. | system_versioning_dropped |
| NOT NULL columns with values that become NULL | NOT NULL 제거값을 NULL로 바꿔야 했던 열은 NOT NULL을 유지할 수 없어요. 유지하면 불러오기가 멈춰요. | not_null_relaxed |
| views, functions, procedures, triggers, synonyms, types and partition functions | 보고서에 나열IntoSQL은 테이블과 그 행을 변환해요. 나머지는 원래 스크립트에서 다시 만들 수 있도록 나열해요. | not_converted_objects |
| scripts without CREATE TABLE (data only) | 값으로 판단한 타입데이터만 있는 스크립트에는 행만 있어서 타입을 값으로 판단해요. | no_schema |
| expressions in INSERT values | NULL데이터베이스를 실행하지 않는 변환기는 이 식을 계산할 수 없어요. | expression_value |
| types IntoSQL doesn't know | nvarchar(max)텍스트는 어떤 값이든 담아요. 불러온 뒤 타입을 바꾸세요. | unknown_type |
| NUL characters in text | 유지nvarchar는 NUL 문자를 담을 수 있어서 값을 그대로 복사해요. | |
| text that isn't valid in its encoding | 잘못된 바이트를 대체 문자로스크립트는 UTF-8이므로 모든 값이 올바른 텍스트여야 해요. | invalid_utf8_replaced |
| text decoded twice (ñ) | 그대로 복사스크립트에 정확히 이 문자들이 있으므로 그대로 복사하고, 보고서에서 알려 줘요. | mojibake_suspected |
스크립트를 SQL Server에 불러오기
스크립트는 테이블을 만들고 행을 복사한 다음 키, 인덱스, 외래 키를 추가해요. 그래서 빨리 불러오고 첫 오류에서 멈춰요.
sqlcmd -b -f 65001 -S localhost -d mydb -i sql_server.sql_server.sql외래 키는 WITH NOCHECK로 추가한 다음 검사해요. 어떤 행이 존재하지 않는 행을 가리키면, 중간에 실패하지 않고 어떤 제약인지 알려 주고 그 제약은 검사하지 않은 채로 남겨요.
큰 덤프는 서버와 같은 컴퓨터에서 sqlcmd를 실행하세요. 최대 1000행의 배치마다 따로 커밋하므로 트랜잭션 로그가 작게 유지돼요.
좋은 결과를 위한 SQL Server 덤프 방법
변환기는 덤프에 담긴 내용을 읽어요. 다음 옵션을 쓰면 더 많은 데이터가 덤프에 남아요:
- SSMS에서 데이터베이스를 마우스 오른쪽 버튼으로 클릭하고 태스크, 스크립트 생성을 차례로 고른 뒤 테이블을 선택하세요. dbatools, mssql-scripter 등 같은 라이브러리로 만든 도구도 같은 스크립트를 써요.
- 고급에서 스크립팅할 데이터 형식을 스키마 및 데이터로 설정하세요. 스키마만 담은 스크립트에는 테이블에 행이 없어요.
- SSMS 기본값인 유니코드나 UTF-8로 저장하세요. 둘 다 같은 방식으로 읽고, gzip도 쓸 수 있어요.
변환되지 않는 것
뷰, 트리거, 프로시저, 함수 등 SQL Server 자체 언어로 작성된 객체는 몰래 빠지지 않고 보고서에 이름으로 나와요. 불러올 SQL Server 버전에서 확인한 뒤 다시 만들 수 있어요.
SQL Server 버전 간 이동 질문
여기에 답이 없나요? 문의 페이지로 연락하시면 담당자가 답장해요. 문의 페이지
덤프가 업로드되나요?
아니요. 변환기는 브라우저에서 실행되고 디스크의 덤프를 조각조각 읽으므로, 덤프가 컴퓨터 밖으로 나가지 않아요. 데스크톱 앱과 명령줄도 컴퓨터에서 변환해요.
덤프는 얼마나 커도 되나요?
변환기는 덤프 전체를 메모리에 올리지 않아요. 파일을 범위별로 두 번 읽고, 읽는 대로 스크립트를 써요. 수 GB 덤프도 브라우저, 데스크톱 앱, 명령줄에서 변환돼요.
SSMS가 저장하는 UTF-16 파일도 읽나요?
네. SSMS는 기본적으로 스크립트를 UTF-16으로 저장하고, 변환기는 UTF-16과 UTF-8을 gzip 여부와 상관없이, 배치 사이의 GO까지 똑같이 읽어요.
어떤 SQL Server 버전의 스크립트를 읽나요?
SQL Server 2017 이상에서 SSMS, dbatools, mssql-scripter로 만든 스크립트예요. 모든 테스트 스크립트는 SQL Server 2017, 2022, 2025에서 만들고 원본과 셀 단위로 비교해요.
IDENTITY 값은 유지되나요?
네. IDENTITY 열은 IDENTITY_INSERT로 불러오고, 모든 행이 id를 유지하며, 카운터는 가장 큰 id 다음부터 이어져요. 시퀀스는 같은 옵션으로 만들어요.
money, datetimeoffset 등 SQL Server 타입은 어떻게 되나요?
그대로 유지돼요. xml, sql_variant, hierarchyid, geometry, geography도 포함되고, 모든 텍스트 열은 콜레이션을 유지해요. datetimeoffset 값은 오프셋을 유지해요. rowversion 열은 스크립트에 값이 없어서 binary(8)이 돼요.
프로시저, 트리거, 뷰는 어떻게 되나요?
변환하지 않고 보고서에 이름으로 나열해요. 테이블을 불러온 뒤 원래 스크립트의 해당 부분을 실행하면 돼요.
스크립트는 어떤 SQL Server 버전에서 불러올 수 있나요?
스크립트를 만든 버전과 상관없이 SQL Server 2017부터 2025까지예요. 같은 스크립트를 각 버전에서 불러오며, 문제가 생기면 첫 오류에서 멈춰요.