Przejdź do treści
Strona główna IntoSQL

Konwertuj SQLite do SQL Server

Upuść plik bazy danych SQLite (.db, .sqlite, .sqlite3) albo SQL zapisany przez .dump z sqlite3 i pobierz skrypt SQL Server z tymi samymi tabelami, kluczami, indeksami i danymi. Każda kolumna dostaje typ, w którym mieszczą się jej wartości, a każda wartość, której SQL Server nie może przechować bez zmian, jest wymieniona w raporcie.

Twój plik
sqlshop_2024_sqlite.sqlPlik przykładowy, 3,4 kB
Twoja baza danych

18 wierszy przekonwertowanych, bez poprawek, brak odrzuconych

Pokaż

Tabele w pliku shop_2024_sqlite.sqlZrzut SQLite · zapisany przez sqlite3 · utf-8

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

Nieprzekonwertowane

  • Widok order_totals
  • Wyzwalacz orders_shipped

Każda baza danych zapisuje je we własnym języku. Przepisz je dla SQL Server.

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

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

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

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

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

Poprawki

Nic nie wymagało poprawek.

Do sprawdzenia

  • Widoki, wyzwalacze, procedury i zdarzenia nie są konwertowane: 2 obiekty, każdy wymieniony w raporcie. Utwórz je ręcznie w SQL Server.
  • Ograniczenia CHECK check1 w tabeli customers nie da się zapisać dla SQL Server (function char_length), więc go nie utworzono. Zapisz ograniczenie CHECK ręcznie, jeśli jest ważne.

Plik jest konwertowany na tym komputerze i nigdy nie jest wysyłany.

Inne przykłady:

Co zmienia się między SQLite a SQL Server

Każdy wiersz to reguła stosowana przez konwerter, z wpisem, który dodaje do raportu, gdy reguła coś zmienia w twoich danych.

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

    typ, w którym mieści się każda wartość kolumny

    SQLite przechowuje dowolną wartość w dowolnej kolumnie, więc zadeklarowany typ jest tylko wskazówką: każda kolumna dostaje typ, w którym mieszczą się wszystkie jej wartości, a kolumna z mieszanymi wartościami zachowuje ich tekst.

  • BOOLEAN, BOOL

    bit

    Gdy każda wartość to 0 lub 1; kolumna, która zawiera też inne wartości, zachowuje je jako liczby lub tekst.

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

    nvarchar(n) lub nvarchar(max)

    SQLite nigdy nie wymusza długości; zadeklarowana długość obowiązuje tylko wtedy, gdy mieści się w niej każda wartość.

  • DECIMAL(p,s), NUMERIC

    dokładny typ, gdy mieści się w nim każda wartość, w przeciwnym razie double

    SQLite przechowuje je jako liczby całkowite lub double; zadeklarowana precyzja obowiązuje tylko wtedy, gdy wartości się w niej mieszczą.

  • BLOB, and columns holding bytes

    varbinary(max)

    Bajty pozostają bajtami; tekst i liczby w tej samej kolumnie są zachowywane jako ich bajty.

  • DATE, DATETIME, TIMESTAMP holding ISO 8601 text

    date, datetime2(p)

    Gdy każda wartość to data lub data z godziną; liczby epoch i inny tekst zachowują swoje wartości bez zmian.

  • JSON holding JSON text

    nvarchar(max)

    Gdy każda wartość to obiekt lub tablica JSON.

  • Infinity in REAL columns

    NULL

    Typ double w SQL Server nie ma nieskończoności, więc te wartości stają się NULL, a raport je liczy.

    Wpis w raporcie: invalid_value_null

  • INTEGER PRIMARY KEY, AUTOINCREMENT

    IDENTITY, kontynuowane po najwyższym id lub wartości z sqlite_sequence

    Tylko kolumna zadeklarowana dokładnie jako INTEGER PRIMARY KEY jest rowid; każdy wiersz zachowuje swoje id, a licznik zaczyna po najwyższym kiedykolwiek wydanym id.

  • COLLATE NOCASE

    porównywanie bez rozróżniania wielkości liter

    Zwykłe porównywanie w SQL Server ignoruje wielkość liter w każdej kolumnie, tak jak NOCASE robiło to dla liter ASCII.

  • generated columns

    kolumny obliczane, PERSISTED przy STORED

    SQL Server oblicza je tak samo.

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

    zwykła kolumna

    Formuła, której nie da się zapisać, zostawia zwykłą kolumnę i wpis w raporcie; zrzut nie zawiera wartości kolumn generowanych.

    Wpis w raporcie: generated_not_translated

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

    brak wartości domyślnej

    Wartość domyślna, której nie da się zapisać, jest pomijana i zgłaszana w raporcie; CURRENT_TIMESTAMP i datetime('now') są zapisywane.

    Wpis w raporcie: default_not_translated

  • CHECK constraints

    przetłumaczone

    Te same ograniczenia CHECK, sprawdzane przy ładowaniu każdego wiersza.

  • CHECK constraints with functions IntoSQL doesn't write

    nie jest tworzone

    Ograniczenie CHECK, którego nie da się zapisać, jest pomijane i zgłaszane w raporcie.

    Wpis w raporcie: check_skipped

  • partial and expression indexes

    nie jest tworzone

    IntoSQL zapisuje indeksy na całych kolumnach; pozostałe utwórz ponownie po załadowaniu.

    Wpis w raporcie: index_skipped

  • foreign keys (unenforced unless PRAGMA foreign_keys=ON)

    po danych z WITH NOCHECK, potem sprawdzany

    SQLite sprawdza klucze obce tylko na żądanie, więc wiersze bez rodzica są częste: ładują się, a klucz zostaje niesprawdzony z ostrzeżeniem, zamiast zatrzymać ładowanie.

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

    NO ACTION

    SQL Server odrzuca kaskady, które mogłyby dwa razy dotrzeć do tej samej tabeli.

    Wpis w raporcie: foreign_key_action_dropped

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

    nvarchar(2n) lub nvarchar(max) powyżej 4000

    nvarchar liczy jednostki UTF-16, a emoji zajmuje dwie, więc kolumna dostaje miejsce na każdą wartość.

    Wpis w raporcie: text_length_widened

  • foreign keys to tables the dump doesn't create

    nie jest tworzone

    Klucz nie może wskazywać tabeli, której nie ma.

    Wpis w raporcie: foreign_key_skipped

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

    NOT NULL usunięte

    SQLite pozwala, by klucz główny inny niż rowid zawierał NULL; kolumna nie może być NOT NULL w bazie docelowej, bo ładowanie by się zatrzymało.

    Wpis w raporcie: not_null_relaxed

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

    wymienione w raporcie

    Ich kod jest napisany we własnym języku SQLite, a tabele wirtualne wymagają modułów SQLite; trafiają na listę do ręcznego odtworzenia. Ich wewnętrzne tabele nie są kopiowane.

    Wpis w raporcie: not_converted_objects

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

    typy odczytane z wartości

    Zrzut samych danych zawiera tylko wiersze, więc typy pochodzą z wartości, a kolumny są numerowane.

    Wpis w raporcie: no_schema

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

    NULL

    unistr(), replace(), char() i || są obliczane tak, jak zapisuje je powłoka; innych wyrażeń nie da się obliczyć bez bazy danych.

    Wpis w raporcie: expression_value

  • NUL characters in text

    zachowane

    Powłoka sqlite3 i Python obcinają tekst na znaku NUL podczas zrzutu, więc w zrzucie jest tylko to, co go poprzedza.

  • text that isn't valid UTF-8

    błędne bajty jako znak zastępczy

    Zrzuty zapisują taki tekst jako surowe bajty; skrypt jest w UTF-8.

    Wpis w raporcie: invalid_utf8_replaced

  • text decoded twice (ñ)

    skopiowane bez zmian

    Zrzut zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.

    Wpis w raporcie: mojibake_suspected

W SQLiteW SQL ServerWpis w raporcie
declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)typ, w którym mieści się każda wartość kolumnySQLite przechowuje dowolną wartość w dowolnej kolumnie, więc zadeklarowany typ jest tylko wskazówką: każda kolumna dostaje typ, w którym mieszczą się wszystkie jej wartości, a kolumna z mieszanymi wartościami zachowuje ich tekst.
BOOLEAN, BOOLbitGdy każda wartość to 0 lub 1; kolumna, która zawiera też inne wartości, zachowuje je jako liczby lub tekst.
TEXT, VARCHAR(n), CHAR(n), CLOBnvarchar(n) lub nvarchar(max)SQLite nigdy nie wymusza długości; zadeklarowana długość obowiązuje tylko wtedy, gdy mieści się w niej każda wartość.
DECIMAL(p,s), NUMERICdokładny typ, gdy mieści się w nim każda wartość, w przeciwnym razie doubleSQLite przechowuje je jako liczby całkowite lub double; zadeklarowana precyzja obowiązuje tylko wtedy, gdy wartości się w niej mieszczą.
BLOB, and columns holding bytesvarbinary(max)Bajty pozostają bajtami; tekst i liczby w tej samej kolumnie są zachowywane jako ich bajty.
DATE, DATETIME, TIMESTAMP holding ISO 8601 textdate, datetime2(p)Gdy każda wartość to data lub data z godziną; liczby epoch i inny tekst zachowują swoje wartości bez zmian.
JSON holding JSON textnvarchar(max)Gdy każda wartość to obiekt lub tablica JSON.
Infinity in REAL columnsNULLTyp double w SQL Server nie ma nieskończoności, więc te wartości stają się NULL, a raport je liczy.invalid_value_null
INTEGER PRIMARY KEY, AUTOINCREMENTIDENTITY, kontynuowane po najwyższym id lub wartości z sqlite_sequenceTylko kolumna zadeklarowana dokładnie jako INTEGER PRIMARY KEY jest rowid; każdy wiersz zachowuje swoje id, a licznik zaczyna po najwyższym kiedykolwiek wydanym id.
COLLATE NOCASEporównywanie bez rozróżniania wielkości literZwykłe porównywanie w SQL Server ignoruje wielkość liter w każdej kolumnie, tak jak NOCASE robiło to dla liter ASCII.
generated columnskolumny obliczane, PERSISTED przy STOREDSQL Server oblicza je tak samo.
generated columns with functions IntoSQL doesn't write, and the || operatorzwykła kolumnaFormuła, której nie da się zapisać, zostawia zwykłą kolumnę i wpis w raporcie; zrzut nie zawiera wartości kolumn generowanych.generated_not_translated
defaults with functions IntoSQL doesn't write (strftime, randomblob)brak wartości domyślnejWartość domyślna, której nie da się zapisać, jest pomijana i zgłaszana w raporcie; CURRENT_TIMESTAMP i datetime('now') są zapisywane.default_not_translated
CHECK constraintsprzetłumaczoneTe same ograniczenia CHECK, sprawdzane przy ładowaniu każdego wiersza.
CHECK constraints with functions IntoSQL doesn't writenie jest tworzoneOgraniczenie CHECK, którego nie da się zapisać, jest pomijane i zgłaszane w raporcie.check_skipped
partial and expression indexesnie jest tworzoneIntoSQL zapisuje indeksy na całych kolumnach; pozostałe utwórz ponownie po załadowaniu.index_skipped
foreign keys (unenforced unless PRAGMA foreign_keys=ON)po danych z WITH NOCHECK, potem sprawdzanySQLite sprawdza klucze obce tylko na żądanie, więc wiersze bez rodzica są częste: ładują się, a klucz zostaje niesprawdzony z ostrzeżeniem, zamiast zatrzymać ładowanie.
ON DELETE or ON UPDATE that cascades in a cycle or along a second pathNO ACTIONSQL Server odrzuca kaskady, które mogłyby dwa razy dotrzeć do tej samej tabeli.foreign_key_action_dropped
VARCHAR(n) holding characters past U+FFFF (emoji)nvarchar(2n) lub nvarchar(max) powyżej 4000nvarchar liczy jednostki UTF-16, a emoji zajmuje dwie, więc kolumna dostaje miejsce na każdą wartość.text_length_widened
foreign keys to tables the dump doesn't createnie jest tworzoneKlucz nie może wskazywać tabeli, której nie ma.foreign_key_skipped
primary keys holding NULL, and NOT NULL columns with values that become NULLNOT NULL usunięteSQLite pozwala, by klucz główny inny niż rowid zawierał NULL; kolumna nie może być NOT NULL w bazie docelowej, bo ładowanie by się zatrzymało.not_null_relaxed
views, triggers and virtual tables (FTS, R*Tree)wymienione w raporcieIch kod jest napisany we własnym języku SQLite, a tabele wirtualne wymagają modułów SQLite; trafiają na listę do ręcznego odtworzenia. Ich wewnętrzne tabele nie są kopiowane.not_converted_objects
dumps without CREATE TABLE (--data-only)typy odczytane z wartościZrzut samych danych zawiera tylko wiersze, więc typy pochodzą z wartości, a kolumny są numerowane.no_schema
expressions in INSERT values other than the text functions dumps writeNULLunistr(), replace(), char() i || są obliczane tak, jak zapisuje je powłoka; innych wyrażeń nie da się obliczyć bez bazy danych.expression_value
NUL characters in textzachowanePowłoka sqlite3 i Python obcinają tekst na znaku NUL podczas zrzutu, więc w zrzucie jest tylko to, co go poprzedza.
text that isn't valid UTF-8błędne bajty jako znak zastępczyZrzuty zapisują taki tekst jako surowe bajty; skrypt jest w UTF-8.invalid_utf8_replaced
text decoded twice (ñ)skopiowane bez zmianZrzut zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.mojibake_suspected

Załaduj skrypt do SQL Server

Skrypt tworzy tabele, kopiuje wiersze, a potem dodaje klucze, indeksy i klucze obce, więc ładuje się szybko i zatrzymuje przy pierwszym błędzie.

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

Klucze obce są dodawane z WITH NOCHECK, a potem sprawdzane. Jeśli wiersz wskazuje na nieistniejący wiersz, skrypt podaje, którego ograniczenia to dotyczy, i zostawia je niesprawdzone, zamiast przerwać w połowie.

Przy dużym zrzucie uruchom sqlcmd na tej samej maszynie co serwer. Każda partia do 1000 wierszy jest zatwierdzana osobno, więc dziennik transakcji pozostaje mały.

Jak zrobić zrzut SQLite dla najlepszego wyniku

Konwerter odczytuje to, co zawiera zrzut. Te opcje zachowują w nim więcej twoich danych:

  • Sam plik bazy danych konwertuje się bez zmian, odczytywany strona po stronie w przeglądarce. Najpierw zamknij aplikację, która do niego zapisuje, żeby żadna zmiana nie została w jego pliku -wal.
  • sqlite3 app.db .dump > app.sql zapisuje tę samą bazę danych jako SQL, który też się konwertuje, jako .sql lub .sql.gz.
  • DB Browser for SQLite zapisuje ten SQL przez File, Export, Database to SQL file, podobnie jak iterdump() w Pythonie.

Co nie jest konwertowane

Widoki i wyzwalacze są pisane we własnym języku SQLite. Raport wymienia je z nazwy i nigdy nie pomija ich po cichu, więc możesz je przepisać dla SQL Server. Tabele wirtualne, takie jak FTS5 i R*Tree, też są wymienione, a ich tabele cieni są pomijane.

Pytania o konwersję SQLite do SQL Server

Nie ma tu odpowiedzi? Napisz do nas przez stronę kontaktu, a odpowie człowiek. Strona kontaktu

Czy mój zrzut jest wysyłany?

Nie. Konwerter działa w przeglądarce i odczytuje zrzut z dysku po kawałku, więc nigdy nie opuszcza on twojego komputera. Aplikacja na komputer i wiersz poleceń też konwertują na twoim komputerze.

Jak duży może być zrzut?

Konwerter nigdy nie trzyma całego zrzutu w pamięci: czyta plik dwa razy, fragmentami, i zapisuje skrypt na bieżąco. Zrzuty wielogigabajtowe konwertują się w przeglądarce, w aplikacji na komputer i w wierszu poleceń.

Czy mogę przekonwertować sam plik .db?

Tak. Upuść plik .db, .sqlite lub .sqlite3: jest odczytywany w przeglądarce i nigdy nie jest wysyłany. Tekst ze znakami NUL i każda cyfra wartości double docierają tak, jak zostały zapisane, a .dump może je obciąć.

Z jakich wersji SQLite może pochodzić zrzut?

Pliki bazy danych od SQLite 3.0, w UTF-8 lub UTF-16, oraz zrzuty z .dump powłoki sqlite3 lub z iterdump() w Pythonie. Każdy testowy plik i zrzut pochodzi z sqlite3 od 3.31 do 3.54, łącznie z tabelami STRICT i WITHOUT ROWID, i jest porównywany ze źródłem komórka po komórce.

Jak ustalane są typy kolumn, skoro SQLite ich nie wymusza?

Zadeklarowany typ jest wskazówką, a decydują wartości: kolumna staje się bigint, decimal, float, date, datetime2, bit, varbinary lub nvarchar, gdy mieści się w nim każda wartość. Tekst porównuje się dokładnie, jak w SQLite, a COLLATE NOCASE bez rozróżniania wielkości liter.

Czy INTEGER PRIMARY KEY i AUTOINCREMENT są zachowywane?

Tak. INTEGER PRIMARY KEY staje się kolumną IDENTITY, każdy wiersz zachowuje swoje id, a kolejne id idzie po najwyższym albo, przy AUTOINCREMENT, po wartości z sqlite_sequence.

A widoki i wyzwalacze?

Raport wymienia je z nazwy, ale nie są konwertowane, bo każda baza danych zapisuje je we własnym języku.

Na jakich wersjach SQL Server ładuje się skrypt?

SQL Server od 2017 do 2025. Ten sam skrypt ładuje się na każdej z nich i zatrzymuje przy pierwszym błędzie, jeśli coś pójdzie nie tak.