MSSQL-Server unter Linux

17.11.2016 - Lesezeit: ~1 Minute

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

Tipps zu MS-SQL/TSQL

13.12.2012 - Lesezeit: 4 Minuten

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 und Restore mit MSSQL\SQLExpress

11.02.2010 - Lesezeit: 2 Minuten

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