Při vývoji je potřeba často zaverzovat skripty pro naplnění dat. Pokud chceme, aby byly opakovaně spustitelné, tak jsou zpravidla plné IF NOT EXISTS…INSERT INTO konstrukcí.
Já mám raději konstrukci se SELECT * FROM (VALUES()), která mi připadá přehlednější. Ukážu na příkladu.
Nejdříve si založíme dvě provázané číselníkové tabule.
IF OBJECT_ID('dbo.Kategorie') IS NULL
CREATE TABLE dbo.Kategorie(
IdKategorie INT NOT NULL IDENTITY CONSTRAINT pk_Kategorie PRIMARY KEY CLUSTERED,
Kod NVARCHAR(50) NOT NULL CONSTRAINT uq_Kategorie_Kod UNIQUE,
Nazev NVARCHAR(250) NOT NULL,
PlatnostOd DATETIME NOT NULL,
PlatnostDo DATETIME NOT NULL
)
GO
IF OBJECT_ID('dbo.KategorieTyp') IS NULL
CREATE TABLE dbo.KategorieTyp(
IdKategorieTyp INT NOT NULL IDENTITY CONSTRAINT pk_KategorieTyp PRIMARY KEY CLUSTERED,
IdKategorie INT NOT NULL CONSTRAINT fk_KategorieTyp_Kategorie FOREIGN KEY (IdKategorie) REFERENCES dbo.Kategorie(IdKategorie),
Kod NVARCHAR(50) NOT NULL CONSTRAINT uq_KategorieTyp_Kod UNIQUE,
Nazev NVARCHAR(250) NOT NULL,
PlatnostOd DATETIME NOT NULL,
PlatnostDo DATETIME NOT NULL
)
GO
Plním to pak pomocí INSERT INTO SELECT, kde za FROM mám konstruktor VALUES, do kterého vypíšu všechna data, co chci založit. Tuhle za běhu vytvořenou tabulku si pojmenuju jako data a její sloupce jako Kod a Nazev. Na tuhle tabuli se pak odkážu za klauzulí SELECT, nebo ve WHERE podmínce.
INSERT INTO dbo.Kategorie
(
Kod,
Nazev,
PlatnostOd,
PlatnostDo
)
SELECT
data.Kod
,data.Nazev
,GETDATE()
,'20991231'
FROM (VALUES
(N'domacnost' ,N'domácnost' ),
(N'podnikatel' ,N'podnikatel' )
)data(Kod ,Nazev)
WHERE NOT EXISTS(
SELECT *
FROM dbo.Kategorie k
WHERE k.Kod = data.Kod
)
GO
INSERT INTO dbo.KategorieTyp
(
IdKategorie,
Kod,
Nazev,
PlatnostOd,
PlatnostDo
)
SELECT
k.IdKategorie
,data.Kod
,data.Nazev
,GETDATE()
,'20991231'
FROM (VALUES
(N'domacnost' ,N'dum' ,N'dům' ),
(N'domacnost' ,N'byt' ,N'byt' ),
(N'domacnost' ,N'chata' ,N'chata' ),
(N'podnikatel' ,N'garaz' ,N'garáž' ),
(N'podnikatel' ,N'provozovna' ,N'provozovna' ),
(N'podnikatel' ,N'kancelar' ,N'kacelář' )
)data(KategorieKod ,Kod ,Nazev)
JOIN dbo.Kategorie k ON data.KategorieKod = k.Kod
WHERE NOT EXISTS(
SELECT *
FROM dbo.KategorieTyp kt
WHERE kt.Kod = data.Kod
)
GO
A tohle jsou konstrukce, které potkávám častěji a přijde mi to škoda:
IF NOT EXISTS(SELECT * FROM dbo.Kategorie k WHERE k.Kod = 'domacnost')
INSERT INTO dbo.Kategorie
(
Kod,
Nazev,
PlatnostOd,
PlatnostDo
)
VALUES
( N'domacnost',
N'domácnost',
GETDATE(),
'20991231'
)
IF NOT EXISTS(SELECT * FROM dbo.Kategorie k WHERE k.Kod = 'podnikatel')
INSERT INTO dbo.Kategorie
(
Kod,
Nazev,
PlatnostOd,
PlatnostDo
)
VALUES
( N'podnikatel',
N'podnikatel',
GETDATE(),
'20991231'
)
GO
IF NOT EXISTS(
SELECT * FROM dbo.KategorieTyp kt WHERE kt.Kod = N'dum'
)
INSERT INTO dbo.KategorieTyp
(
IdKategorie,
Kod,
Nazev,
PlatnostOd,
PlatnostDo
)
VALUES
( (SELECT k.IdKategorie FROM dbo.Kategorie k WHERE k.Kod = 'domacnost'),
N'dum',
N'dům',
GETDATE(),
'20991231'
)
IF NOT EXISTS(
SELECT * FROM dbo.KategorieTyp kt WHERE kt.Kod = N'byt'
)
INSERT INTO dbo.KategorieTyp
(
IdKategorie,
Kod,
Nazev,
PlatnostOd,
PlatnostDo
)
VALUES
( (SELECT k.IdKategorie FROM dbo.Kategorie k WHERE k.Kod = 'domacnost'),
N'byt',
N'byt',
GETDATE(),
'20991231'
)
GO