Ein SQL Server-Skript auf ein älteres oder neueres SQL Server bringen
Zieh das Skript, das Generate Scripts in SSMS mit Schema und Daten schreibt, als .sql oder .sql.gz in UTF-16 oder UTF-8 hierher und lade eines herunter, das auf SQL Server 2017 bis 2025 lädt, egal welche Version es geschrieben hat. Identities, Collations und Typen wie xml und hierarchyid bleiben, wie sie sind, und jede Änderung steht im Bericht.
18 Zeilen konvertiert, 1 Korrektur, keine abgelehnt
Tabellen in shop_2024_sqlserver.sqlSQL Server-Dump · erstellt mit SQL Server Management Objects · utf-8
orders10 Zeilen
11 Spalten 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 Zeilen1
8 Spalten 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)
Nicht konvertiert
- Sicht paid_orders
- Trigger orders_no_negative
Jede Datenbank schreibt diese in ihrer eigenen Sprache. Schreib sie für SQL Server neu.
-- 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
Korrekturen
- "row_version" von customers ist eine Zeilenversion, die SQL Server selbst setzt; der Dump hat keine Werte dafür, daher ist es binary(8) und leer.
Zu prüfen
- 2 Sichten, Trigger, Routinen oder Ereignisse werden nicht konvertiert; der Bericht listet sie einzeln auf. Lege sie in SQL Server von Hand neu an.
- Die CHECK-Bedingung check1 auf orders lässt sich nicht für SQL Server schreiben (function isjson), daher wird sie nicht angelegt. Schreib die CHECK-Bedingung von Hand, wenn sie wichtig ist.
- Der Index idx_orders_pending auf orders nutzt einen Ausdruck, der sich nicht für SQL Server schreiben lässt (an index on an expression), daher wird er nicht angelegt. Lege den Index von Hand an, wenn Abfragen ihn brauchen.
Deine Datei wird auf diesem Computer umgewandelt und nie hochgeladen.
Weitere Beispiele:
Was sich zwischen Datei und Skript ändert
Jede Zeile ist eine Regel, die der Konverter anwendet, mit der Berichtszeile, die er schreibt, wenn die Regel etwas an deinen Daten ändert.
bit
bit
Derselbe Typ.
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text, ntext
nchar(n), nvarchar(n) und nvarchar(max), mit der Kollation jeder Spalte
nvarchar fasst jedes Zeichen, egal welche Codepage eine varchar-Spalte hatte. UTF-8-Kollationen, die SQL Server 2017 fehlen, werden zu ihrem Unicode-Gegenstück.
column collations
dieselbe Kollation auf jeder Spalte
Spalten vergleichen und sortieren wie zuvor, und eindeutige Schlüssel halten dieselben Zeilen auseinander.
decimal(p,s), money, smallmoney
decimal(p,s); money als decimal(19,4)
Jede Stelle bleibt erhalten, money mit seinen vier Nachkommastellen.
datetime, datetime2, smalldatetime
datetime2(p)
datetime2 fasst jeden datetime- und smalldatetime-Wert ab dem Jahr 1, mit derselben Genauigkeit.
datetimeoffset
datetimeoffset, mit dem Versatz jedes Werts
Derselbe Typ und dieselben Werte.
time
time(p)
Derselbe Typ.
dates that aren't valid
NULL
Ein Wert, der kein Datum ist, wird NULL, und der Bericht zählt ihn.
Berichtszeile: date_out_of_range
json (SQL Server 2025)
nvarchar(max)
Dieselben JSON-Werte, die die JSON-Funktionen von SQL Server lesen.
uniqueidentifier
uniqueidentifier
Derselbe Typ.
binary, varbinary, image
binary(n), varbinary(n) und varbinary(max)
Bytes bleiben Bytes.
xml, sql_variant, hierarchyid, geometry, geography
dieselben Typen
Die eigenen Typen von SQL Server bleiben erhalten; sql_variant-Werte behalten ihren Text, daher wird ihr Basistyp nvarchar.
rowversion, timestamp
binary(8), leer
Eine rowversion-Spalte kann die kopierten Zeilen nicht aufnehmen, und SSMS schreibt keine Werte dafür; füge sie nach dem Laden neu hinzu, falls du eine brauchst.
Berichtszeile: rowversion_empty
IDENTITY
IDENTITY, weiter nach der höchsten ID
Die kopierten IDs laden mit IDENTITY_INSERT, und der Zähler macht nach der höchsten weiter.
CREATE SEQUENCE
CREATE SEQUENCE mit denselben Optionen
Sequenzen in SQL Server funktionieren genauso. SSMS schreibt nicht, wie weit eine Sequenz gekommen ist, daher beginnt sie dort, wo sie angelegt wurde.
computed columns
dieselben berechneten Spalten, PERSISTED wie in der Quelle
Dieselben Formeln, berechnet vom Ziel.
computed columns with functions IntoSQL doesn't write
eine normale Spalte
Eine Formel, die sich nicht schreiben lässt, hinterlässt eine normale Spalte und eine Zeile im Bericht; SSMS schreibt keine Werte für berechnete Spalten.
Berichtszeile: generated_not_translated
defaults with functions IntoSQL doesn't write, and NEXT VALUE FOR
kein Standardwert
Ein Standardwert, der sich nicht schreiben lässt, wird weggelassen und gemeldet.
Berichtszeile: default_not_translated
CHECK constraints
übersetzt
Dieselben CHECK-Bedingungen, geprüft beim Laden jeder Zeile.
CHECK constraints with functions IntoSQL doesn't write
nicht angelegt
Eine CHECK-Bedingung, die sich nicht schreiben lässt, wird weggelassen und gemeldet.
Berichtszeile: check_skipped
CHECK constraints added WITH NOCHECK or disabled
nicht angelegt
SQL Server wendet diese CHECK-Bedingungen nicht an, daher können die Zeilen sie verletzen.
Berichtszeile: check_not_enforced
filtered and columnstore indexes
nicht angelegt
IntoSQL schreibt B-Tree-Indizes auf ganze Spalten; lege die anderen nach dem Laden neu an.
Berichtszeile: index_skipped
foreign keys
nach den Daten, WITH NOCHECK, dann geprüft, mit einer Warnung bei verwaisten Zeilen
Der Schlüssel wird nach den Zeilen angelegt und zuletzt geprüft; Zeilen ohne Elternzeile lassen ihn mit einer Warnung ungeprüft, statt das Laden abzubrechen.
ON DELETE or ON UPDATE that cascades in a cycle or along a second path
NO ACTION
SQL Server lehnt diese Kaskaden ab, daher enthält ein Dump nie eine; die Zeile ist für von Hand bearbeitete Skripte da.
Berichtszeile: foreign_key_action_dropped
foreign keys to tables the dump doesn't create
nicht angelegt
Ein Schlüssel kann nicht auf eine Tabelle verweisen, die es nicht gibt.
Berichtszeile: foreign_key_skipped
tables on a partition scheme
eine Tabelle mit den Zeilen aller Partitionen
Die Zeilen sind dieselben; partitioniere die Tabelle in SQL Server neu, wenn nötig.
Berichtszeile: partitions_dropped
temporal tables (SYSTEM_VERSIONING)
zwei Tabellen: die aktuellen Zeilen und die Historie
Die Tabelle und ihre Historientabelle werden als normale Tabellen kopiert; schalte SYSTEM_VERSIONING wieder ein, um sie zu verknüpfen.
Berichtszeile: system_versioning_dropped
NOT NULL columns with values that become NULL
NOT NULL entfernt
Eine Spalte, deren Werte NULL werden mussten, kann NOT NULL nicht behalten, sonst würde das Laden abbrechen.
Berichtszeile: not_null_relaxed
views, functions, procedures, triggers, synonyms, types and partition functions
im Bericht aufgeführt
IntoSQL konvertiert Tabellen und ihre Zeilen; der Rest wird aufgeführt, damit du ihn aus dem ursprünglichen Skript neu anlegst.
Berichtszeile: not_converted_objects
scripts without CREATE TABLE (data only)
Typen aus den Werten gelesen
Ein Skript nur mit Daten enthält nur Zeilen, daher kommen die Typen aus den Werten.
Berichtszeile: no_schema
expressions in INSERT values
NULL
Ein Konverter, der keine Datenbank ausführt, kann sie nicht auswerten.
Berichtszeile: expression_value
types IntoSQL doesn't know
nvarchar(max)
Text nimmt jeden Wert auf; ändere den Typ nach dem Laden.
Berichtszeile: unknown_type
NUL characters in text
erhalten
nvarchar kann ein NUL-Zeichen enthalten, daher wird der Wert unverändert kopiert.
text that isn't valid in its encoding
die fehlerhaften Bytes als Ersatzzeichen
Das Skript ist UTF-8, und jeder Wert muss gültiger Text sein.
Berichtszeile: invalid_utf8_replaced
text decoded twice (ñ)
unverändert kopiert
Das Skript enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin.
Berichtszeile: mojibake_suspected
| In der Datei | Im Skript | Berichtszeile |
|---|---|---|
| bit | bitDerselbe Typ. | |
| char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text, ntext | nchar(n), nvarchar(n) und nvarchar(max), mit der Kollation jeder Spaltenvarchar fasst jedes Zeichen, egal welche Codepage eine varchar-Spalte hatte. UTF-8-Kollationen, die SQL Server 2017 fehlen, werden zu ihrem Unicode-Gegenstück. | |
| column collations | dieselbe Kollation auf jeder SpalteSpalten vergleichen und sortieren wie zuvor, und eindeutige Schlüssel halten dieselben Zeilen auseinander. | |
| decimal(p,s), money, smallmoney | decimal(p,s); money als decimal(19,4)Jede Stelle bleibt erhalten, money mit seinen vier Nachkommastellen. | |
| datetime, datetime2, smalldatetime | datetime2(p)datetime2 fasst jeden datetime- und smalldatetime-Wert ab dem Jahr 1, mit derselben Genauigkeit. | |
| datetimeoffset | datetimeoffset, mit dem Versatz jedes WertsDerselbe Typ und dieselben Werte. | |
| time | time(p)Derselbe Typ. | |
| dates that aren't valid | NULLEin Wert, der kein Datum ist, wird NULL, und der Bericht zählt ihn. | date_out_of_range |
| json (SQL Server 2025) | nvarchar(max)Dieselben JSON-Werte, die die JSON-Funktionen von SQL Server lesen. | |
| uniqueidentifier | uniqueidentifierDerselbe Typ. | |
| binary, varbinary, image | binary(n), varbinary(n) und varbinary(max)Bytes bleiben Bytes. | |
| xml, sql_variant, hierarchyid, geometry, geography | dieselben TypenDie eigenen Typen von SQL Server bleiben erhalten; sql_variant-Werte behalten ihren Text, daher wird ihr Basistyp nvarchar. | |
| rowversion, timestamp | binary(8), leerEine rowversion-Spalte kann die kopierten Zeilen nicht aufnehmen, und SSMS schreibt keine Werte dafür; füge sie nach dem Laden neu hinzu, falls du eine brauchst. | rowversion_empty |
| IDENTITY | IDENTITY, weiter nach der höchsten IDDie kopierten IDs laden mit IDENTITY_INSERT, und der Zähler macht nach der höchsten weiter. | |
| CREATE SEQUENCE | CREATE SEQUENCE mit denselben OptionenSequenzen in SQL Server funktionieren genauso. SSMS schreibt nicht, wie weit eine Sequenz gekommen ist, daher beginnt sie dort, wo sie angelegt wurde. | |
| computed columns | dieselben berechneten Spalten, PERSISTED wie in der QuelleDieselben Formeln, berechnet vom Ziel. | |
| computed columns with functions IntoSQL doesn't write | eine normale SpalteEine Formel, die sich nicht schreiben lässt, hinterlässt eine normale Spalte und eine Zeile im Bericht; SSMS schreibt keine Werte für berechnete Spalten. | generated_not_translated |
| defaults with functions IntoSQL doesn't write, and NEXT VALUE FOR | kein StandardwertEin Standardwert, der sich nicht schreiben lässt, wird weggelassen und gemeldet. | default_not_translated |
| CHECK constraints | übersetztDieselben CHECK-Bedingungen, geprüft beim Laden jeder Zeile. | |
| CHECK constraints with functions IntoSQL doesn't write | nicht angelegtEine CHECK-Bedingung, die sich nicht schreiben lässt, wird weggelassen und gemeldet. | check_skipped |
| CHECK constraints added WITH NOCHECK or disabled | nicht angelegtSQL Server wendet diese CHECK-Bedingungen nicht an, daher können die Zeilen sie verletzen. | check_not_enforced |
| filtered and columnstore indexes | nicht angelegtIntoSQL schreibt B-Tree-Indizes auf ganze Spalten; lege die anderen nach dem Laden neu an. | index_skipped |
| foreign keys | nach den Daten, WITH NOCHECK, dann geprüft, mit einer Warnung bei verwaisten ZeilenDer Schlüssel wird nach den Zeilen angelegt und zuletzt geprüft; Zeilen ohne Elternzeile lassen ihn mit einer Warnung ungeprüft, statt das Laden abzubrechen. | |
| ON DELETE or ON UPDATE that cascades in a cycle or along a second path | NO ACTIONSQL Server lehnt diese Kaskaden ab, daher enthält ein Dump nie eine; die Zeile ist für von Hand bearbeitete Skripte da. | foreign_key_action_dropped |
| foreign keys to tables the dump doesn't create | nicht angelegtEin Schlüssel kann nicht auf eine Tabelle verweisen, die es nicht gibt. | foreign_key_skipped |
| tables on a partition scheme | eine Tabelle mit den Zeilen aller PartitionenDie Zeilen sind dieselben; partitioniere die Tabelle in SQL Server neu, wenn nötig. | partitions_dropped |
| temporal tables (SYSTEM_VERSIONING) | zwei Tabellen: die aktuellen Zeilen und die HistorieDie Tabelle und ihre Historientabelle werden als normale Tabellen kopiert; schalte SYSTEM_VERSIONING wieder ein, um sie zu verknüpfen. | system_versioning_dropped |
| NOT NULL columns with values that become NULL | NOT NULL entferntEine Spalte, deren Werte NULL werden mussten, kann NOT NULL nicht behalten, sonst würde das Laden abbrechen. | not_null_relaxed |
| views, functions, procedures, triggers, synonyms, types and partition functions | im Bericht aufgeführtIntoSQL konvertiert Tabellen und ihre Zeilen; der Rest wird aufgeführt, damit du ihn aus dem ursprünglichen Skript neu anlegst. | not_converted_objects |
| scripts without CREATE TABLE (data only) | Typen aus den Werten gelesenEin Skript nur mit Daten enthält nur Zeilen, daher kommen die Typen aus den Werten. | no_schema |
| expressions in INSERT values | NULLEin Konverter, der keine Datenbank ausführt, kann sie nicht auswerten. | expression_value |
| types IntoSQL doesn't know | nvarchar(max)Text nimmt jeden Wert auf; ändere den Typ nach dem Laden. | unknown_type |
| NUL characters in text | erhaltennvarchar kann ein NUL-Zeichen enthalten, daher wird der Wert unverändert kopiert. | |
| text that isn't valid in its encoding | die fehlerhaften Bytes als ErsatzzeichenDas Skript ist UTF-8, und jeder Wert muss gültiger Text sein. | invalid_utf8_replaced |
| text decoded twice (ñ) | unverändert kopiertDas Skript enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin. | mojibake_suspected |
Das Skript in SQL Server laden
Das Skript legt die Tabellen an, kopiert die Zeilen und fügt dann Schlüssel, Indizes und Fremdschlüssel hinzu, so lädt es schnell und hält beim ersten Fehler an.
sqlcmd -b -f 65001 -S localhost -d mydb -i sql_server.sql_server.sqlFremdschlüssel werden mit WITH NOCHECK hinzugefügt und dann geprüft. Verweist eine Zeile auf eine nicht vorhandene Zeile, nennt das Skript den Fremdschlüssel und lässt ihn ungeprüft, statt auf halbem Weg abzubrechen.
Führe bei einem großen Dump sqlcmd auf dem Rechner des Servers aus. Jeder Stapel von bis zu 1000 Zeilen wird einzeln festgeschrieben, so bleibt das Transaktionsprotokoll klein.
Den SQL Server-Dump für das beste Ergebnis erstellen
Der Konverter liest, was der Dump enthält. Mit diesen Optionen bleibt mehr von deinen Daten darin:
- Klicke in SSMS mit der rechten Maustaste auf die Datenbank, dann auf Tasks, Generate Scripts, und wähle die Tabellen. dbatools, mssql-scripter und andere Werkzeuge auf Basis derselben Bibliothek schreiben dasselbe Skript.
- Setze unter Advanced die Option Types of data to script auf Schema and data. Ein Skript nur mit dem Schema hat Tabellen ohne Zeilen.
- Speichere es als Unicode, den Standard von SSMS, oder als UTF-8: Beides wird gleich gelesen, und gzip funktioniert auch.
Was nicht konvertiert wird
Views, Trigger, Prozeduren, Funktionen und andere Objekte in der eigenen Sprache von SQL Server stehen mit Namen im Bericht und werden nie stillschweigend entfernt, damit du jedes vor dem Neuanlegen mit der SQL Server-Version abgleichen kannst, in die du lädst.
Fragen zum Wechsel von SQL Server zwischen Versionen
Keine Antwort gefunden? Schreib uns über die Kontaktseite, und ein Mensch antwortet. Kontaktseite
Wird mein Dump hochgeladen?
Nein. Der Konverter läuft in deinem Browser und liest den Dump stückweise von deiner Festplatte, daher verlässt er nie deinen Computer. Die Desktop-App und die Kommandozeile konvertieren ebenfalls auf deinem Computer.
Wie groß darf der Dump sein?
Der Konverter hält nie den ganzen Dump im Speicher: Er liest die Datei zweimal, in Abschnitten, und schreibt das Skript fortlaufend. Dumps von mehreren Gigabyte werden im Browser, in der Desktop-App und mit der Kommandozeile konvertiert.
Liest es die UTF-16-Datei, die SSMS speichert?
Ja. SSMS speichert Skripte standardmäßig als UTF-16, und der Konverter liest UTF-16 und UTF-8 gleichermaßen, gezippt oder nicht, mit GO zwischen den Batches.
Aus welchen SQL Server-Versionen kann das Skript stammen?
Skripte, die SSMS, dbatools oder mssql-scripter ab SQL Server 2017 schreiben. Jedes Test-Skript stammt aus SQL Server 2017, 2022 und 2025 und wird Zelle für Zelle mit seiner Quelle verglichen.
Bleiben IDENTITY-Werte erhalten?
Ja. IDENTITY-Spalten laden mit IDENTITY_INSERT, jede Zeile behält ihre ID, und der Zähler macht nach der höchsten weiter. Sequenzen werden mit denselben Optionen angelegt.
Was passiert mit money, datetimeoffset und anderen SQL Server-Typen?
Sie bleiben, wie sie sind, einschließlich xml, sql_variant, hierarchyid, geometry und geography, und jede Textspalte behält ihre Kollation. datetimeoffset-Werte behalten ihren Versatz. rowversion-Spalten werden binary(8), weil das Skript keine Werte für sie enthält.
Was ist mit Prozeduren, Triggern und Sichten?
Sie stehen mit Namen im Bericht und werden nicht konvertiert, damit du ihren Teil des ursprünglichen Skripts ausführen kannst, sobald die Tabellen da sind.
Auf welchen SQL Server-Versionen lädt das Skript?
SQL Server 2017 bis 2025, egal welche Version das Skript geschrieben hat. Dasselbe Skript lädt auf jeder Version und hält beim ersten Fehler an, falls etwas schiefgeht.