Перенесите скрипт SQL Server на более старую или новую версию SQL Server
Перетащите скрипт, который Generate Scripts в SSMS пишет со схемой и данными, в формате .sql или .sql.gz, в UTF-16 или UTF-8, и скачайте скрипт, который загружается на SQL Server с 2017 по 2025, какая бы версия его ни записала. Identity, collation и типы вроде 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
Исправления
- "row_version" таблицы customers - это версия строки, которую SQL Server задает сам; в дампе нет ее значений, поэтому это binary(8), и столбец пуст.
Требует проверки
- Не конвертированы представления, триггеры, процедуры и события (2 объекта); отчет перечисляет каждый. Создайте их заново вручную в SQL Server.
- Проверку check1 таблицы orders нельзя записать для SQL Server (function isjson), поэтому она не создана. Запишите проверку вручную, если она важна.
- Индекс idx_orders_pending таблицы orders использует выражение, которое нельзя записать для 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. Сортировки UTF-8, которых нет в SQL Server 2017, становятся своим аналогом Unicode.
column collations
та же сортировка у каждого столбца
Столбцы сравниваются и сортируются как раньше, а уникальные ключи различают те же строки.
decimal(p,s), money, smallmoney
decimal(p,s); money как decimal(19,4)
Сохраняется каждая цифра, money - со своими четырьмя знаками после запятой.
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, которые читают функции JSON в SQL Server.
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, а счетчик продолжается после наибольшего.
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)
Тип text вмещает любое значение; измените тип после загрузки.
Строка отчета: 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. Сортировки UTF-8, которых нет в SQL Server 2017, становятся своим аналогом Unicode. | |
| column collations | та же сортировка у каждого столбцаСтолбцы сравниваются и сортируются как раньше, а уникальные ключи различают те же строки. | |
| decimal(p,s), money, smallmoney | decimal(p,s); money как decimal(19,4)Сохраняется каждая цифра, money - со своими четырьмя знаками после запятой. | |
| 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, которые читают функции JSON в SQL Server. | |
| 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, а счетчик продолжается после наибольшего. | |
| 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 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)Тип text вмещает любое значение; измените тип после загрузки. | 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 щелкните базу данных правой кнопкой, выберите Tasks, Generate Scripts и отметьте таблицы. dbatools, mssql-scripter и другие инструменты на той же библиотеке пишут такой же скрипт.
- В разделе Advanced задайте для Types of data to script значение Schema and data. Скрипт только со схемой содержит таблицы без строк.
- Сохраните его в Unicode, как по умолчанию в SSMS, или в UTF-8: оба читаются одинаково, gzip тоже подходит.
Что не конвертируется
Представления, триггеры, процедуры, функции и другие объекты, написанные на собственном языке SQL Server, перечислены в отчете по имени и никогда не удаляются молча, чтобы вы могли проверить каждый на той версии SQL Server, в которую загружаете, прежде чем создать его заново.
Вопросы о переносе SQL Server между версиями
Нет ответа на ваш вопрос? Напишите нам через страницу контактов, и вам ответит человек. Страница контактов
Мой дамп загружается на сервер?
Нет. Конвертер работает в вашем браузере и читает дамп с диска по частям, поэтому он никогда не покидает ваш компьютер. Приложение для компьютера и командная строка тоже конвертируют на вашем компьютере.
Насколько большим может быть дамп?
Конвертер никогда не держит весь дамп в памяти: он читает файл дважды, по диапазонам, и пишет скрипт по ходу чтения. Дампы в несколько гигабайт конвертируются в браузере, в приложении для компьютера и в командной строке.
Читает ли он файл UTF-16, который сохраняет SSMS?
Да. SSMS по умолчанию сохраняет скрипты в UTF-16, а конвертер одинаково читает UTF-16 и UTF-8, сжатые gzip или нет, с GO между пакетами.
Из каких версий SQL Server может быть скрипт?
Скрипты, которые SSMS, dbatools или mssql-scripter пишут из SQL Server 2017 и новее. Каждый тестовый скрипт создан в SQL Server 2017, 2022 и 2025 и сверен с источником ячейка за ячейкой.
Сохраняются ли значения IDENTITY?
Да. Столбцы IDENTITY загружаются с IDENTITY_INSERT, каждая строка сохраняет свой id, а счетчик продолжается после наибольшего. Последовательности создаются с теми же параметрами.
Что происходит с money, datetimeoffset и другими типами SQL Server?
Они остаются как есть, включая xml, sql_variant, hierarchyid, geometry и geography, и каждый текстовый столбец сохраняет свою сортировку. Значения datetimeoffset сохраняют свои смещения. Столбцы rowversion становятся binary(8), потому что в скрипте нет их значений.
А процедуры, триггеры и представления?
Они перечислены в отчете по имени и не конвертируются, чтобы вы могли выполнить их часть исходного скрипта, когда таблицы будут загружены.
На каких версиях SQL Server загружается скрипт?
SQL Server с 2017 по 2025, какой бы версией ни был записан скрипт. Один и тот же скрипт загружается на каждой из них и останавливается на первой ошибке, если что-то пойдет не так.