Reset the identity key for a column in SQL Server

Sometimes you need to reset an identity column value back to 0 (after inserting test-data and deleting the rows again for example). Of course, generally you shouldn’t change primary keys and of course primary key values doesn’t matter at all, but for the case you want to start with an new idenity 1 for the first row then simply use:

DBCC CHECKIDENT('YOURTABLENAME', RESEED, 0)

mySql HowTo: Verwendung von IF-Statements

mySql

 

Durch die Verwendung der IF()-Funktion in mySQL kann man sich oftmals weitere unnötige Abfragen sparen. In diesem kleinen HowTow möchte ich dies kurz an ein paar einfachen Beispielen zeigen, auch in Verwendung mit weiteren Funktionen, hier im konkreten Fall mit SUM(). Ich denke, das reicht aus, um das Prinzip leicht zu verstehen.

Generelle Syntax von IF():
SELECT IF (2 > 1, 'das ist wahr', 'das ist falsch')

Die Funkion hat also 3 Parameter. Der erste ist die Bedingung, der zweite der Wert, der zurückgegeben wird, wenn die Bedingung wahr ist und der dritte der Wert, der zurückgegeben wird, wenn die Bedingung falsch ist.
In obigem Beispiel ist die Bedingung ist wahr, deshalb wir also der erste Wert ausgegeben.

Beispiel 2:
SELECT IF (2 = 1, 'das ist wahr', 'das ist falsch')

Die Bedingung ist nun falsch, deshalb wir der zweite Wert ausgegeben.

Beispiel 3:
Wenn wir uns nun vorstellen, dass wir eine Tabelle haben, in der Kunden erfasst sind, die deren Stammdaten auch das Land, in dem sie wohnen, erfasst ist, dann wäre eine sinnvolle Abfrage, wieviel Kunden aus Deutschland bzw. wieviele Kunden aus dem Ausland kommen. Das könnten wir mit einem Count in 2 Abfragen mit where-Bedingung leicht herausfinden, es geht aber auch eleganter in einem Rutsch. Das sähe dann ungefähr so aus:

SELECT SUM(IF(country = 'Deutschland',1,0)) as kunden_deutsch,
SELECT SUM(IF(country != 'Deutschland',1,0)) as kunden_international
FROM customers

Beispiel 4:
Wir haben eine Tabelle mit Produkten aus verschiedenen Kategorien, auch der Preis ist hinterlegt in den Produktdaten.
Es gibt bei uns eine magische Grenze von 20 Euro, alles was über dieser Grenze liegt, wird von unseren Kunden als teuer eingestuft, alles was darunter liegt, wirkt auf unsere Kunden preiswert.
Es wäre schön, wenn wir nun schnell rausfinden könnten, wieviele preiswerte und wieviele teure Produkte es gibt. Diese Information möchten wir natürlich auch pro Kategorie visualisieren.

SELECT category
SUM(IF(price <= 20,1,0)) as preiswert,
SUM(IF(price > 20,1,0)) as teuer
FROM products
GROUP BY category

Das Ergebnis gibt die Summe der preiswerten und teuren Produkte gruppiert nach Kategorie aus.

Trim-Funktionen in SQL Server 2005/2008

Zumindest wenn man mit dem SQL Server von Microsoft als Datenbank arbeitet, gibt es einen kleinen Fallstrick hinsichtlich nicht vorhandener TRIM()-Funktion. Diese in fast allen Sprachen implementierte und oft benutzte Standard-Funktion gibt es nämlich ärgerlicherweise einfach nicht (Stand SQL Server 2005/2008). Es gibt nur die beiden Funktionen LTRIM() und RTRIM(), die eben die leading beziehungsweise die trailing spaces entfernen. Es wird also Lösung empfohlen beide Funktionen zu benutzen, schön ist natürlich aber was anderes:

LTRIM(RTRIM(string))

Einen Feature-Request dazu gibt es schon. Alternativ dazu gibt es unter http://sqltrim.codeplex.com/ eine angepasste Funktion, um TRIM() benutzen zu können, ist für SQL Server 2005/2008 benutzbar.

mySQL Backups auf Konsole

Sichern von Datenbanken ist eine Sache, die man täglich braucht – bzw. täglich brauchen sollte. Es gibt wie immer viele Wege, diesen Job zu erledigen, aber am schnellsten läßt sich das sicherlich direkt in der Kommandozeile erledigen, damit ist man dann auch unabhängig von GUI-basierten Tools wie dem mySQL-Administrator oder phpMyadmin.
Das Kommando ist sehr übersichtlich:

mysqldump -u mysqluser -p mysqldatabase

Zur Erklärung: mysqldump ist das Programm, das wir benutzen, um das Backup zu erstellen. Das Programm kann verschiedene Paramter entgegennehmen, wir verwenden hier diese:

„-u“ bedeutet, dass wir die Aktion mit einem bestimmten User durchführen, der Username muss dem -u nachfolgen wie oben im Beispiel gezeigt.
„-p“ bedeutet, dass ein Passwort mitübergeben wird, das eebenfalls direkt nach -p eingetippt wird. Wird es nicht angegeben, wird ein Promt erscheinen, wo man das Passwort eingibt.

Eine vollständige Liste der Parameter kann übrigens mit mysql –help oder dem Aufruf der Manpage des Tools eingesehen werden:

man mysqldump

Ok, wenn man das Kommando oben ausführt, sieht man die Aktionen direkt in der Konsole vorbeihuschen – das ist schön, denn wir wissen damit, dass unser Kommando funktioniert, allerdings fehlt eine entscheidende Information: wo ist unsere Sicherung? Die Antwort ist: nirgends, denn wir haben das Backup nicht in ein File geschrieben. Um das nachzuholen, benutzt man zusätzlich zum oberen Kommando eine Redirection, was sehr einfach ist:

mysqldump -u mysqluser -p mysqldatabase > my_DB_backup.sql

Nun wird das Backup in das File mit dem spezifiziertem Namen geschrieben. Wenn man das File mit der Endung .sql in einem Text-Editor öffnet, sieht man alle SQL-Anweisungen zum Erstellen der Struktur und Inhalte der Datenbank. Was jetzt möglicherweise noch sinnvoll wäre, ist das Backup-File auch gleich komprimiert zu haben. Dazu benutzen wir Piping, mittels Piping übergeben wir den Output von mysqldump an das Tool gzip, welches dann die Komprimierung für uns übernimmt:

mysqldump -u mysqluser -p mysqldatabase | gzip > my_DB_backup.sql.gz

Statt gzip kann natürlich analog auch ein anderes Tool wie zip oder tar verwendet werden.

MS SQL-Server: einfache Hochkammata escapen in SQL-Statement

nur am Rande: falls mal jemand ein Update-Statement auf einen char- oder text-Feld machen muss, dann ist es hilfreich zu wissen, dass eventuell vorkommende einfache Anführungszeichen nicht, wie man natürlich intuitiv vermuten würde, mit Backshlash maskiert werden,  sondern im Statement gedoppelt werden müssen. Der String für die Update-Anwesung muss ja ebenfalls in einzelne Anführungszeichen gesteckt werden, das verursacht das Problem. Hier ein Beispiel:

UPDATE TABLE SET MYTEXTFIELD = '<sometag someattribute=''something''></sometag><anothertag anotherattribute=''something''></anothertag>' WHERE PKID = 123

Beim Beispiel ist nur darauf zu achten, dass es sich hier um einfache Anführungszeichen handelt, nicht um die im Deutschen gebräuchlichen doppelten Anführungszeichen.

Einsatz von case when then in SQL (MS SQL Server)

Manchmal ist es notwendig, auch in einem SQL-Statement eine Fallunterscheidung durchzuführen.
Die generelle Syntax dafür sieht folgendermaßen aus:

SELECT ProductId,
ProductCat =
CASE ProductBehavorial
WHEN 'R' THEN 'Road'
WHEN 'M' THEN 'Mountain'
WHEN 'T' THEN 'Touring'
ELSE 'Not for sale'
END,
ProductName
FROM ProductItems
ORDER BY ProductId

Das kann auch schnell etwas verschachtelter aussehen, wenn Subselects und weitere Funktionen wie isNull() mit in das Statement kommen, hier noch ein weiteres Beispiel dazu mit Verwendung von Untescheidungen anhand von integer-Werten:

SELECT col1,col2,col3,
CASE
WHEN isnull((select value1 from table2 prti where col1 = value1),0) > 90 THEN 'sehr gut'
WHEN isnull((select value1 from table2 prti where col1 = value1),0) > 79 THEN 'gut'
WHEN isnull((select value1 from table2 prti where col1 = value1),0) > 69 THEN 'befriedigend'
WHEN isnull((select value1 from table2 prti where col1 = value1),0) > 59 THEN 'ausreichend'
WHEN isnull((select value1 from table2 prti where col1 = value1),0) > 49 THEN 'mangelhaft'
WHEN isnull((select value1 from table2 prti where col1 = value1),0) > 10 THEN 'ungenügend'
ELSE 'katastrophal'
END as myrating

Die CASE/WHEN Kombination kann auch in der ORDER BY-Klausel verwendet werden, das sieht dann so aus:

SELECT col1, col2
FROM HumanResources.Employee
ORDER BY
CASE col2 WHEN 1 THEN col1 END DESC,
CASE WHEN col2 = 0 THEN col1 END;

In einem UPDATE-Statement sieht die Verwendung so aus:

UPDATE table1
SET column1 =
( CASE
WHEN ((column1 - 10.00) < 0) THEN column1 + 15
ELSE (column1 + 20.00)
END
)
WHERE column2 = 0;

MS SQL: alle Indizes einer Datenbank per SQL abfragen

Abteilung praktische Tipps: mit folgendem SQL kann man sich fix alle Indizes einer MS SQL Datenbank auslesen:

SELECT i.object_id, i.name, o.name
FROM sys.indexes as i, sys.objects as o
WHERE i.name not like 'queue%'
and i.object_id = o.object_id
AND o.name NOT like 'sys%'

Sehr praktisch und sehr übersichtlich, wenn man schnell sehen kann, auf welcher Tabelle welcher Index liegt. Kann man echt oft brauchen, war mir sofort ein Snippet wert.

Reblog this post [with Zemanta]

Besonderheiten char/varchar und nchar/nvarchar in MS-SQL

In MS-SQL gibt es zwei Datentypen die nahezu identisch sind:

char & varchar beziehungsweise nchar & nvarchar

Der einzige Unterschied zwischen char und varchar liegt darin, dass der char-Typ den kompletten Speicher in der Zeile reserviert., wo hingegen der varchar das ganze dynamisch macht.

Beispiel:
Char(255) würde exakt 255 Zeichen in der Zeile reservieren. Es ist egal ob da nur 1 oder 200 Zeichen drin stehen – der Rest wird mit blanks ausgefüllt, was natürlich unnötig Plattenkapazität in Anspruch nimmt.

Beim Suchen oder bei der Ausgabe müssen dann die Blanks wieder getrimmt werden bzw. like %ICHSUCHE% Abfragen durchgeführt werden. Dies geht auf natürlich auf Kosten der Performance.

Varchar(255) würde nur so viele Zeichen reservieren wie der String tatsächlich lang ist. Das ist schön, denn: weniger Speicherverbrauch & bessere und schnellere Suchabfragen

Gleiches gilt übrigens auch analog für binary & varbinary!