# Microsoft SQL Server/Fonctions

* Introduction
* Bases de données
* Gestion des utilisateurs
* Variables
* Tables
* Procédures stockées
* Fonctions
* Bases de données spatiales
* Performances
* Importer et exporter
* SugarCRM

## Annexes

* Mots réservés
* Problèmes connus
* Introduction
* Bases de données
* Gestion des utilisateurs
* Variables
* Tables
* Procédures stockées
* Fonctions
* Bases de données spatiales
* Performances
* Importer et exporter
* SugarCRM

## Annexes

* Mots réservés
* Problèmes connus
[ Modifier le sommaire ]

## Introduction

On distingue deux types de fonctions :
* scalaire : renvoie n'importe quel type de données applicables aux champs, hormis text, ntext, image, cursor et timestamp.
* table : renvoie une table.

## Environnement SERVERPROPERTY

La fonction suivante permet de récupérer le nom du serveur courant :

## Condition ISNULL

Cette fonction ne renvoie pas vrai si la variable est nulle, comme dans d'autres langages de programmation, mais plutôt son second paramètre, un substitut à NULL obligatoire. Ceci permet de lever les exceptions sur les variables nulles directement dans les requêtes, sans ajout de ligne supplémentaire.
Voici un exemple où Les NULL sont traités comme les vides :

## Extrémums : MIN, MAX

Les fonctions Min et Max renvoient respectivement le minimum et le maximum d'une liste de champs.

## Conversions : CAST et CONVERT

CAST modifie le type d'une variable :
CONVERT modifie le type d'une variable en premier paramètre, et sa longueur en second.
Tous les types de variable ne sont pas compatibles entre eux.
Exemple de problème :
Les dates ne sont pas forcément reconnues sans utiliser convert. La solution est donc de stocker les dates si possible dans le format datetime :
Si par contre la date du paragraphe ci-dessus est stockée en varchar avec des slashs, il devient obligatoire de la reformater pour pouvoir la comparer.
De nombreux formats de dates sont disponibles.

## Arrondis : FLOOR, CEILING, ROUND

Pour arrondir un nombre :
* À l'inférieur : floor(nombre).
* Au supérieur : ceiling(nombre).
* Au nombre de chiffres précisé : round(nombre, chiffres). Ex :
    round(499, -3) = 0.
    round(500, -3) = 1000.
    round(0.45, 1) = 0.50.
    round(0.44, 1) = 0.40.
Pour arrondir une opération sur un entier (ex : COUNT), il faut le convertir sinon il s'arrondit à l'inférieur. Ex :

## Troncatures : LEFT, RIGHT, et SUBSTRING

Permettent de découper des chaines de caractères selon les positions de leurs caractères.
Par exemple dans le cas de la date avec slashs vue dans le paragraphe précédent :

## Recherche CHARINDEX

Pour rechercher la position d'un mot dans une chaine de caractères :

## Manipulations : REPLACE et STUFF

Permettent de remplacer des caractères dans une chaine selon leur valeur : rechercher et remplacer.
Par exemple pour mettre à jour le chemin d'un répertoire renommé :

## Dates
### Format date

La fonction GETDATE est utilisée pour la date courante. Pour obtenir plutôt la date d'un jour donné au format date, il faut utiliser CONVERT :

### Découpage

La fonction DATEPART extrait une partie de date sans avoir besoin de son emplacement.
Toutefois, trois fonctions permettent d'accélérer l'écriture de ce type d'extractions :

### Noms

La fonction DATENAME permet d'obtenir les noms des éléments d'une date. Ex :

### Addition et soustraction de jours

Voici deux fonctions de manipulation de dates :
* DATEDIFF calcule l’intervalle entre deux dates.
* DATEADD retourne la date issue d'une autre plus un intervalle.
Exemple :
donne :

## Divers
### COALESCE

Ce verbe anglais signifie "fusionner". La fonction affiche la première colonne en paramètre, puis si elle est nulle la deuxième, et ainsi de suite.
Exemple :

### RAND

Abréviation de random (aléatoire), génère un nombre au hasard entre zéro et un.
Exemple :

## Personnalisée

On peut aussi créer ses propres fonctions avec CREATE FUNCTION, qui sont stockées dans un menu séparé à côté des tables et des procédures stockées.

## Triggers

Les triggers sont des scripts qui se déclenchent selon certains évènements, et sont créés avec CREATE TRIGGER. Dans SSMS, on les trouvent dans le menu Déclencheurs de base de données.
Par exemple pour afficher un texte à chaque création de base :
Parmi les évènements disponibles, on trouve :
* FOR CREATE_DATABASE
* IF UPDATE
* IF INSERTED
Les actions à entreprendre peuvent être :
* INSTEAD OF INSERT : l'action du trigger remplace une insertion.
* INSERT AFTER
* UPDATE AFTER

### EVENTDATA

EVENTDATA est une fonction qui renvoie une valeur XML si elle est référencée dans un trigger.

## Références

* ↑ https://technet.microsoft.com/fr-fr/library/ms177499(v=sql.105).aspx
* ↑ man CONVERT
* ↑ http://stackoverflow.com/questions/74385/how-to-convert-datetime-to-varchar
* ↑ man SUBSTRING
* ↑ https://msdn.microsoft.com/fr-fr/library/ms186323.aspx
* ↑ man STUFF
* ↑ man REPLACE
* ↑ man DATEPART
* ↑ https://msdn.microsoft.com/fr-fr/library/ms174395.aspx
* ↑ http://blog.sqlauthority.com/2007/08/18/sql-server-find-last-day-of-any-month-current-previous-next/
* ↑ man DATEDIFF
* ↑ man DATEADD
* ↑ https://msdn.microsoft.com/fr-fr/library/ms177610.aspx
* ↑ https://msdn.microsoft.com/fr-fr/library/ms186755(v=sql.120).aspx
* ↑ https://msdn.microsoft.com/fr-fr/library/ms189799(v=sql.100).aspx
* ↑ https://msdn.microsoft.com/fr-fr/library/ms173781.aspx