MSSQL

MSSQL-Server unter Linux

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:

default alt. text

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: 

Tipps zu MS-SQL/TSQL

http://www.studentshelp.de/…/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: 

Backup und Restore mit MSSQL\SQLExpress

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\Bac­kup\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\Bac­kup\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ätsle­vel 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: