Skip to content
IntoSQL home

Move a SQL Server script to an older or newer SQL Server

Drop the script SSMS's Generate Scripts writes with schema and data, as .sql or .sql.gz, UTF-16 or UTF-8, and download one that loads on SQL Server 2017 to 2025, whichever version wrote it. Identities, collations and types such as xml and hierarchyid stay as they are, and every change is listed in the report.

Your file
sqlshop_2024_sqlserver.sqlSample file, 11 kB
Your database

18 rows converted, 1 fix, none rejected

Show

Tables in shop_2024_sqlserver.sqlSQL Server dump · written by SQL Server Management Objects · utf-8

  • orders10 rows
    11 columns
    idint not null
    customer_idint not null
    statusnvarchar(10) not null
    totaldecimal(19,4) not null
    itemstinyint not null
    ordered_atdatetime2(0) not null
    shipped_atdatetime2(7)
    notenvarchar(max)
    detailsnvarchar(max)
    order_refuniqueidentifier not null
    total_with_taxdecimal(12,2)
  • customers8 rows1
    8 columns
    idint not null
    namenvarchar(100) not null
    emailnvarchar(200) not null
    countrynchar(2) not null
    is_activebit not null
    signed_update
    created_atdatetimeoffset(0) not null
    row_versionbinary(8)

Not converted

  • View paid_orders
  • Trigger orders_no_negative

Each database writes these in its own language. Rewrite them for 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

Fixes

  1. "row_version" of customers is a row version SQL Server sets by itself; the dump has no values for it, so it is binary(8) and empty.

Needs a look

  • 2 views, triggers, routines or events aren't converted; the report lists each one. Recreate them by hand in SQL Server.
  • The check check1 on orders can't be written for SQL Server (function isjson), so it isn't created. Write the check by hand if it matters.
  • The index idx_orders_pending on orders uses an expression that can't be written for SQL Server (an index on an expression), so it isn't created. Create the index by hand if queries need it.

Your file is converted on this computer and never uploaded.

Other samples:

What changes between the file and the script

Each row is a rule the converter applies, with the report line it writes when the rule changes something in your data.

  • bit

    bit

    The same type.

  • char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text, ntext

    nchar(n), nvarchar(n) and nvarchar(max), with each column's collation

    nvarchar holds every character, whatever the code page of a varchar column was. UTF-8 collations, which SQL Server 2017 lacks, become their Unicode twin.

  • column collations

    the same collation on each column

    Columns compare and sort as they did, and unique keys keep the same rows apart.

  • decimal(p,s), money, smallmoney

    decimal(p,s); money as decimal(19,4)

    Every digit is kept, money with its four decimals.

  • datetime, datetime2, smalldatetime

    datetime2(p)

    datetime2 holds every datetime and smalldatetime value, from the year 1, with the same precision.

  • datetimeoffset

    datetimeoffset, with each value's offset

    The same type and values.

  • time

    time(p)

    The same type.

  • dates that aren't valid

    NULL

    A value that isn't a date becomes NULL and the report counts it.

    Report line: date_out_of_range

  • json (SQL Server 2025)

    nvarchar(max)

    The same JSON values, which SQL Server's JSON functions read.

  • uniqueidentifier

    uniqueidentifier

    The same type.

  • binary, varbinary, image

    binary(n), varbinary(n) and varbinary(max)

    Bytes stay bytes.

  • xml, sql_variant, hierarchyid, geometry, geography

    the same types

    SQL Server's own types are kept; sql_variant values keep their text, so their base type becomes nvarchar.

  • rowversion, timestamp

    binary(8), empty

    A rowversion column can't take the copied rows, and SSMS scripts no values for it; add it again after loading if you need one.

    Report line: rowversion_empty

  • IDENTITY

    IDENTITY, continuing after the highest id

    The copied ids load with IDENTITY_INSERT, and the counter continues after the highest one.

  • CREATE SEQUENCE

    CREATE SEQUENCE with the same options

    SQL Server sequences work the same way. SSMS doesn't script where a sequence has reached, so it starts where it was created.

  • computed columns

    the same computed columns, PERSISTED as in the source

    The same formulas, computed by the target.

  • computed columns with functions IntoSQL doesn't write

    a plain column

    A formula that can't be written leaves a plain column and a report line; SSMS scripts no values for computed columns.

    Report line: generated_not_translated

  • defaults with functions IntoSQL doesn't write, and NEXT VALUE FOR

    no default

    A default that can't be written is left out and reported.

    Report line: default_not_translated

  • CHECK constraints

    translated

    The same checks, tested as each row loads.

  • CHECK constraints with functions IntoSQL doesn't write

    not created

    A check that can't be written is left out and reported.

    Report line: check_skipped

  • CHECK constraints added WITH NOCHECK or disabled

    not created

    SQL Server doesn't apply these checks, so the rows may break them.

    Report line: check_not_enforced

  • filtered and columnstore indexes

    not created

    IntoSQL writes b-tree indexes on whole columns; create the others again after loading.

    Report line: index_skipped

  • foreign keys

    after the data WITH NOCHECK, then checked with a warning on orphans

    The key is created after the rows and checked last; rows without a parent leave it unchecked with a warning instead of stopping the load.

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

    NO ACTION

    SQL Server refuses those cascades, so a dump never holds one; the row is here for scripts edited by hand.

    Report line: foreign_key_action_dropped

  • foreign keys to tables the dump doesn't create

    not created

    A key can't name a table that isn't there.

    Report line: foreign_key_skipped

  • tables on a partition scheme

    one table with every partition's rows

    The rows are the same; partition the table again in SQL Server if it needs it.

    Report line: partitions_dropped

  • temporal tables (SYSTEM_VERSIONING)

    two tables: the current rows and the history

    The table and its history table are copied as plain tables; turn SYSTEM_VERSIONING on again to link them.

    Report line: system_versioning_dropped

  • NOT NULL columns with values that become NULL

    NOT NULL dropped

    A column whose values had to become NULL can't keep NOT NULL, or the load would stop.

    Report line: not_null_relaxed

  • views, functions, procedures, triggers, synonyms, types and partition functions

    listed in the report

    IntoSQL converts tables and their rows; the rest is listed for you to recreate from the original script.

    Report line: not_converted_objects

  • scripts without CREATE TABLE (data only)

    types read from the values

    A data-only script has only rows, so the types come from the values.

    Report line: no_schema

  • expressions in INSERT values

    NULL

    A converter that doesn't run a database can't evaluate them.

    Report line: expression_value

  • types IntoSQL doesn't know

    nvarchar(max)

    Text holds any value; change the type after loading.

    Report line: unknown_type

  • NUL characters in text

    kept

    nvarchar can hold a NUL character, so the value is copied as it is.

  • text that isn't valid in its encoding

    the bad bytes as the replacement character

    The script is UTF-8 and every value has to be valid text.

    Report line: invalid_utf8_replaced

  • text decoded twice (ñ)

    copied as it is

    The script holds exactly these characters, so they are copied; the report points them out.

    Report line: mojibake_suspected

In the fileIn the scriptReport line
bitbitThe same type.
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text, ntextnchar(n), nvarchar(n) and nvarchar(max), with each column's collationnvarchar holds every character, whatever the code page of a varchar column was. UTF-8 collations, which SQL Server 2017 lacks, become their Unicode twin.
column collationsthe same collation on each columnColumns compare and sort as they did, and unique keys keep the same rows apart.
decimal(p,s), money, smallmoneydecimal(p,s); money as decimal(19,4)Every digit is kept, money with its four decimals.
datetime, datetime2, smalldatetimedatetime2(p)datetime2 holds every datetime and smalldatetime value, from the year 1, with the same precision.
datetimeoffsetdatetimeoffset, with each value's offsetThe same type and values.
timetime(p)The same type.
dates that aren't validNULLA value that isn't a date becomes NULL and the report counts it.date_out_of_range
json (SQL Server 2025)nvarchar(max)The same JSON values, which SQL Server's JSON functions read.
uniqueidentifieruniqueidentifierThe same type.
binary, varbinary, imagebinary(n), varbinary(n) and varbinary(max)Bytes stay bytes.
xml, sql_variant, hierarchyid, geometry, geographythe same typesSQL Server's own types are kept; sql_variant values keep their text, so their base type becomes nvarchar.
rowversion, timestampbinary(8), emptyA rowversion column can't take the copied rows, and SSMS scripts no values for it; add it again after loading if you need one.rowversion_empty
IDENTITYIDENTITY, continuing after the highest idThe copied ids load with IDENTITY_INSERT, and the counter continues after the highest one.
CREATE SEQUENCECREATE SEQUENCE with the same optionsSQL Server sequences work the same way. SSMS doesn't script where a sequence has reached, so it starts where it was created.
computed columnsthe same computed columns, PERSISTED as in the sourceThe same formulas, computed by the target.
computed columns with functions IntoSQL doesn't writea plain columnA formula that can't be written leaves a plain column and a report line; SSMS scripts no values for computed columns.generated_not_translated
defaults with functions IntoSQL doesn't write, and NEXT VALUE FORno defaultA default that can't be written is left out and reported.default_not_translated
CHECK constraintstranslatedThe same checks, tested as each row loads.
CHECK constraints with functions IntoSQL doesn't writenot createdA check that can't be written is left out and reported.check_skipped
CHECK constraints added WITH NOCHECK or disablednot createdSQL Server doesn't apply these checks, so the rows may break them.check_not_enforced
filtered and columnstore indexesnot createdIntoSQL writes b-tree indexes on whole columns; create the others again after loading.index_skipped
foreign keysafter the data WITH NOCHECK, then checked with a warning on orphansThe key is created after the rows and checked last; rows without a parent leave it unchecked with a warning instead of stopping the load.
ON DELETE or ON UPDATE that cascades in a cycle or along a second pathNO ACTIONSQL Server refuses those cascades, so a dump never holds one; the row is here for scripts edited by hand.foreign_key_action_dropped
foreign keys to tables the dump doesn't createnot createdA key can't name a table that isn't there.foreign_key_skipped
tables on a partition schemeone table with every partition's rowsThe rows are the same; partition the table again in SQL Server if it needs it.partitions_dropped
temporal tables (SYSTEM_VERSIONING)two tables: the current rows and the historyThe table and its history table are copied as plain tables; turn SYSTEM_VERSIONING on again to link them.system_versioning_dropped
NOT NULL columns with values that become NULLNOT NULL droppedA column whose values had to become NULL can't keep NOT NULL, or the load would stop.not_null_relaxed
views, functions, procedures, triggers, synonyms, types and partition functionslisted in the reportIntoSQL converts tables and their rows; the rest is listed for you to recreate from the original script.not_converted_objects
scripts without CREATE TABLE (data only)types read from the valuesA data-only script has only rows, so the types come from the values.no_schema
expressions in INSERT valuesNULLA converter that doesn't run a database can't evaluate them.expression_value
types IntoSQL doesn't knownvarchar(max)Text holds any value; change the type after loading.unknown_type
NUL characters in textkeptnvarchar can hold a NUL character, so the value is copied as it is.
text that isn't valid in its encodingthe bad bytes as the replacement characterThe script is UTF-8 and every value has to be valid text.invalid_utf8_replaced
text decoded twice (ñ)copied as it isThe script holds exactly these characters, so they are copied; the report points them out.mojibake_suspected

Load the script into SQL Server

The script creates the tables, copies the rows, then adds keys, indexes and foreign keys, so it loads fast and stops at the first error.

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

Foreign keys are added WITH NOCHECK and then checked. If a row points to a row that doesn't exist, the script says which constraint and leaves it unchecked, instead of failing half way.

For a large dump, run sqlcmd on the same machine as the server. Each batch of up to 1000 rows commits on its own, so the transaction log stays small.

Dump SQL Server for the best result

The converter reads what the dump holds. These options keep more of your data in it:

  • In SSMS, right-click the database, Tasks, Generate Scripts, and pick the tables. dbatools, mssql-scripter and other tools built on the same library write the same script.
  • Under Advanced, set Types of data to script to Schema and data. A script of the schema alone has tables without rows.
  • Save it as Unicode, SSMS's default, or as UTF-8: both are read the same way, and gzip works too.

What isn't converted

Views, triggers, procedures, functions and other objects written in SQL Server's own language are listed in the report by name, never dropped silently, so you can check each one against the SQL Server version you load into before recreating it.

Questions about moving SQL Server between versions

Not answered here? Write to us from the contact page and a person replies. Contact page

Is my dump uploaded?

No. The converter runs in your browser and reads the dump from your disk in pieces, so it never leaves your computer. The desktop app and the command line convert on your computer too.

How large can the dump be?

The converter never holds the whole dump in memory: it reads the file twice, by ranges, and writes the script as it goes. Multi-gigabyte dumps convert in the browser, in the desktop app and with the command line.

Does it read the UTF-16 file SSMS saves?

Yes. SSMS saves scripts as UTF-16 by default, and the converter reads UTF-16 and UTF-8 alike, gzipped or not, with GO between batches.

Which SQL Server versions can the script come from?

Scripts that SSMS, dbatools or mssql-scripter write from SQL Server 2017 on. Every test script comes from SQL Server 2017, 2022 and 2025 and is compared with its source cell by cell.

Are IDENTITY values kept?

Yes. IDENTITY columns load with IDENTITY_INSERT, every row keeps its id, and the counter continues after the highest one. Sequences are created with the same options.

What happens to money, datetimeoffset and other SQL Server types?

They stay as they are: xml, sql_variant, hierarchyid, geometry and geography included, and every text column keeps its collation. datetimeoffset values keep their offsets. rowversion columns are binary(8), because the script has no values for them.

What about procedures, triggers and views?

They are listed in the report by name and not converted, so you can run their part of the original script once the tables are in.

Which SQL Server versions does the script load on?

SQL Server 2017 to 2025, whichever version wrote the script. The same script loads on each of them, stopping at the first error if anything goes wrong.