Wie heise verkündet ist Vorschauversion des MSSQL Server für Linux verfügbar
Die Installation unter Kubuntu 16.04 ist von Microsoft gut beschrieben
Da ich in meinen SQL-Anweisungen das deutsche Datumsformat verwendet habe ist es nötig den Datenbankserver auf Deutsch umzustellen:
In meinem Delphi-Programm verwende ich diesen Connectionstring zum Zugrigriff auf die Datenbank
Provider=SQLNCLI11.1;Server=c2016.fritz.box;Database=beispieldaten;User Id=SA; Password=xxxx;
Meine Datenbank beispieldaten stelle ich mit dem folgenden SQL-Anweisung wieder her
USE master
GO
RESTORE DATABASE [beispieldaten]
FROM
DISK = N'/wnfdaten/kido_datensicherungen/kido_backup_2016_11_01.bak'
WITH
FILE = 1,
MOVE N'kido2010' TO N'/var/opt/mssql/data/beispieldaten.mdf',
MOVE N'kido2010_log' TO N'/var/opt/mssql/data/beispieldaten.ldf',
REPLACE,
NOREWIND,
NOUNLOAD
GO
Tags: MSSQL
http://www.studentshelp.de/p/referate/02/6533.htm
Performance Probleme beim MS-SQL-Server
Schöne SQL-Anweisungen HAVING
SELECT
E.FAD,
COUNT(*) AS "Anzahl Kinderhistorien",
K.VOR AS "Kind",
B.KURZ
FROM b9_Kindhis H
LEFT JOIN b9_Kind K ON K.ID=H.KIND_ID
LEFT JOIN b9_Eltern E ON E.ID=K.ELT_ID
LEFT JOIN b9_Bearbeiter B ON B.ID=E.BEARBEITER_ID
WHERE '01.08.2010' BETWEEN H.VON AND H.BIS
GROUP BY E.FAD,H.KIND_ID,K.VOR,B.KURZ
HAVING COUNT(*)>1
ORDER BY 1 DESC
```-
```-
SELECT SUM(F.KFaellig),K.ELT_ID,E.FAD FROM b9_egFaellig F
LEFT JOIN b9_KIND K ON K.ID = F.KIND_ID
LEFT JOIN b9_Eltern E ON E.ID = K.ELT_ID
WHERE F.DATUM BETWEEN '01.01.2011' AND '31.12.2011'
GROUP BY K.ELT_ID,E.FAD
HAVING SUM(F.KFaellig)=0
ORDER BY 1
```-
**Vorsicht bei UNION**
UNION fasst alle gleichen Datensätze zusammen. Falls also wirklich alle Datensätze angezeigt werden sollen,
dann müssen diese sich unterscheiden. Deshalb habe ich hier die ID (X.IB,Y.ID,N.ID) mit angehängt.
```-
SELECT 1 AS ART,K.EART,E.FAD,X.DATUM,X.KASSE_SOLL,X.VS,0 AS LZ, X.ID, (SELECT COUNT(*)
FROM b9_KassenLaufX
WHERE ELT_ID=X.ELT_ID AND KASSENLAUF_ID=1760 AND KITA_ID=X.KITA_ID) AS ANZAHL
FROM b9_KassenLaufX X
LEFT JOIN b9_Kita K ON K.ID=X.KITA_ID
LEFT JOIN b9_Eltern E ON E.ID=X.ELT_ID
WHERE X.KASSENLAUF_ID=1760 AND K.BVHAUSHALT=48
UNION
SELECT 2 AS ART,L.EGEART,F.FAD,Y.DATUM,Y.KASSE_SOLL,Y.VS,0 AS LZ,Y.ID, (SELECT COUNT(*)
FROM b9_KassenLaufE
WHERE ELT_ID=Y.ELT_ID AND KASSENLAUF_ID=1760 AND KITA_ID=Y.KITA_ID) AS ANZAHL
FROM b9_KassenLaufE Y
LEFT JOIN b9_Kita L ON L.ID=Y.KITA_ID
LEFT JOIN b9_Eltern F ON F.ID=Y.ELT_ID
WHERE Y.KASSENLAUF_ID=1760 AND L.EGHAUSHALT=48
UNION
SELECT 3 AS ART,N.EART,N.FAD,N.FAELLIG,N.BETRAG,N.VS,N.LZ,N.ID, 1 AS ANZAHL
FROM b9_KassenLaufN N
WHERE N.KASSENLAUF_ID=1760 AND N.BVHAUSHALT=48
ORDER BY 2,3,4
```-
**DELETE mit LEFT JOIN**
```-
DELETE b9_egErm FROM b9_egErm E
LEFT JOIN b9_Kind K ON K.ID=E.KIND_ID
WHERE K.ELT_ID=123
```-
**UPDATE mit LEFT JOIN**
```-
UPDATE b9_Kindhis
SET GRUPPENART=99
FROM b9_KindHis H
LEFT JOIN b9_Kind K ON K.ID=H.KIND_ID
WHERE K.ELT_ID IS NULL
AND H.GRUPPENART=0
GO
UPDATE b9_Kindhis
SET GRUPPENART=0
FROM b9_KindHis H
LEFT JOIN b9_Kind K ON K.ID=H.KIND_ID
WHERE K.ELT_ID IS NULL
AND H.GRUPPENART=1
GO
UPDATE b9_Kindhis
SET GRUPPENART=1
FROM b9_KindHis H
LEFT JOIN b9_Kind K ON K.ID=H.KIND_ID
WHERE K.ELT_ID IS NULL
AND H.GRUPPENART=99
GO
```-
**SELECT mit Unterabfrage**
```-
SELECT
E.FAD,
Y.KURZ AS 'Bearbeiter',
K.Vor,
L.DATUM AS 'Letzter Monat',
H.EINKOMMEN,
T.GRUPPENR,
B.ART,
L.BEITRAG,
CASE B.WOFUER
WHEN 1 THEN 'Kita'
WHEN 2 THEN 'OGS'
WHEN 3 THEN 'Tagespflege'
END AS 'Einrichtungsart'
FROM b9_BeiLis L
LEFT JOIN b9_Kind K ON K.ID=L.KIND_ID
LEFT JOIN b9_Eltern E ON E.ID=L.ELT_ID
LEFT JOIN b9_EltHis H ON H.ID=L.ELTHIS_ID
LEFT JOIN b9_Beitab T ON T.ID=L.BEITAB_ID
LEFT JOIN b9_Beitrag B ON B.ID=T.ART_ID
LEFT JOIN b9_Bearbeiter Y ON Y.ID=E.BEARBEITER_ID
WHERE L.DATUM=(
SELECT
MAX(M.DATUM)
FROM b9_BeiLis M
WHERE M.ELT_ID=L.ELT_ID
GROUP BY M.ELT_ID
HAVING MAX(M.DATUM)<'01.08.2010')
ORDER BY Y.KURZ,E.FAD
```-
Tags: MSSQL
Backup
BACKUP DATABASE [test_db]
TO
DISK = N'wnf_test.sav'
WITH
NOFORMAT,
NOINIT,
NAME = N'test_db backup',
NOREWIND,
NOUNLOAD,
SKIP
Die Backup-Datei wird hier erzeugt:
"c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\wnf_test.sav"
Restore
Es wird eine "fremde" Datensicherung eingelesen, deswegen muss MOVE TO verwendet werden.
Die Restor-Datei steht hier:
"c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\test_d7.sav"
RESTORE DATABASE [test_d7]
FROM
DISK = N'test_d7.sav'
WITH
FILE = 1,
MOVE N'D7_Daten' TO N'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\test_D7_Data.MDF',
MOVE N'D7_Protokoll' TO N'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\test_D7_Log.LDF',
NOREWIND,
NOUNLOAD
Aufräumarbeiten
Da die Datensicherung aus einer MSSQL Server 2000 Datenbank kommt, muss der Datenbank-Kompatibilitätslevel noch eingestellt werden.
EXEC sp_dbcmptlevel 'test_d7', 90
GO
Auf der Original-Datenbank gab es ein Schema für den D7-Nutzer, das wird nicht mehr benötigt.
DROP SCHEMA [D7-Nutzer]
GO
Auch der D7-Nutzer wird nicht mehr benötigt.
DROP USER [D7-Nutzer]
GO
Tags: MSSQL