<!--
  canonical-url: https://www.avonture.be/fr/blog/docker-mssql-server
  published:     2024-01-05
  This is a static plain-Markdown mirror generated at build time.
  Visit the canonical URL above for the fully rendered page, with images and interactive components.
-->

# Jouer avec Microsoft SQL Server 2022 avec Docker

> Lancez facilement MSSQL Server 2022 avec Docker. Ce guide pas à pas vous montre comment installer le container, vous connecter avec SSMS et commencer à interroger votre base de données.

---
![Jouer avec Microsoft SQL Server 2022 avec Docker](/img/v2/mssql.webp)

**TL;DR**

Cet article montre comment lancer Microsoft SQL Server 2022 dans Docker, s'y connecter avec SQL Server Management Studio (SSMS) et créer une base de données et une table d'exemple. Il se termine par un petit script PowerShell qui se connecte à la base et exécute une query : un aller-retour complet en local, du container aux résultats.

Et oui, rien de moins. Nous allons installer un **Microsoft SQL Server 2022** sur notre machine, installer aussi **SQL Server Management Studio** et nous amuser avec un petit script PowerShell ; le tout avec Docker, évidemment. *Si c'est Oracle qu'il vous faut, j'ai aussi écrit [Running Oracle Database Server as a Docker container](/blog/docker-oracle-database-server).*

Le repository Docker officiel de Microsoft SQL Server se trouve sur <https://hub.docker.com/_/microsoft-mssql-server>.

Commençons par télécharger et lancer une instance de SQL Server 2022 avec l'instruction suivante :

```bash
$ docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=2Secure*Password2" -p 1433:1433 --name sqlserverdb -h mysqlserver -d mcr.microsoft.com/mssql/server:2022-latest
```

Avec la commande ci-dessus, nous acceptons les termes du *End-User License Agreement* et nous définissons le mot de passe de l'utilisateur `SA` à `2Secure*Password2`.

Le port que nous utiliserons sur notre host est le port 1433 (mappé sur le port `1433` du container), notre instance SQL Server s'appellera sqlserverdb (nom interne utilisé par Docker) et nous nommerons notre host `mysqlserver`.

Nous pouvons vérifier la liste des containers en cours d'exécution grâce à docker container list :

```bash
$ docker container list
[...] IMAGE                                       [...] NAMES
[...] mcr.microsoft.com/mssql/server:2022-latest  [...] sqlserverdb
```

> **La sortie ci-dessus a été simplifiée:**
>
> Pour plus de clarté, la sortie de `docker container list` a été simplifiée ici ; toutes les colonnes n'ont pas été reprises dans l'article.

Maintenant, si vous n'avez pas encore **SQL Server Management Studio** (aussi appelé **SSMS**) sur votre machine, téléchargez-le gratuitement depuis <https://learn.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16>.

Lancez le programme d'installation et attendez qu'il soit installé sur votre machine.

![Installation de SQL Server Management Studio](./images/download_ssms.webp)

Démarrez maintenant SSMS (vous le trouverez dans votre menu `Start` de Windows) :

![Ouverture de SSMS](./images/opening_ssms.webp)

Utilisez les valeurs ci-dessous pour l'authentification :

| Label            | Value                       |
| ---------------- | --------------------------- |
| Nom du serveur   | `localhost,1433`            |
| Authentification | `SQL Server Authentication` |
| Login            | `SA`                        |
| Mot de passe     | `2Secure*Password2`         |

> **Pourquoi ces valeurs ?:**
>
> 1433 est le numéro de port que nous avons déclaré dans notre instruction `docker run`, l'utilisateur *admin* par défaut est `SA` et le mot de passe a été initialisé plus tôt à `2Secure*Password2` (voir la variable d'environnement `MSSQL_SA_PASSWORD` dans notre commande `docker run`.)

![Authentification](./images/authentication.webp)

Cliquez sur le bouton `Connect` et SSMS sera connecté à votre instance Docker. Il est temps de créer notre base de données.

> **Pas de client Windows ?:**
>
> SSMS ne fonctionne que sous Windows. Pour une alternative dans le navigateur qui fonctionne avec presque tous les moteurs, voyez [Using Adminer, pgadmin or phpmyadmin to access your Docker database container](/blog/docker-adminer-pgadmin-phpmyadmin).

## Créer la base de données, la table et ajouter quelques enregistrements {#create-the-database-the-table-and-add-some-records}

Une fois connecté dans SSMS, exécutez la query suivante pour créer une base de données d'exemple `MyDB`, créer une table appelée `dbo.Person` et ajouter quelques enregistrements.

Pour ce faire, cliquez sur le bouton `New Query` (ou pressez `CTRL`-`N`), collez le SQL ci-dessous puis cliquez sur le bouton `Execute` (ou pressez `F5`).

![Créer la base de données](./images/create_database.webp)

**create\_db.sql**

```sql
USE [master]
GO

CREATE DATABASE [MyDB]
 CONTAINMENT = NONE
 ON  PRIMARY
( NAME = N'MyDB', FILENAME = N'/var/opt/mssql/data/MyDB.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
 LOG ON
( NAME = N'MyDB_log', FILENAME = N'/var/opt/mssql/data/MyDB_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
 WITH CATALOG_COLLATION = DATABASE_DEFAULT
GO

USE [MyDB]
GO

CREATE TABLE [dbo].[Person](
 [FirstName] [varchar](50) NULL,
 [LastName] [varchar](50) NULL
) ON [PRIMARY]
GO

INSERT INTO dbo.Person (LastName, FirstName) VALUES
 ('Avonture', 'Christophe'),
 ('Doe', 'John');
GO
```

Félicitations, vous avez créé une base de données `MyDB` avec une table `dbo.Person` :

![La base de données a été créée](./images/database_created.webp)

> **Pensez à rafraîchir l'`Object Explorer`:**
>
> Si, après avoir lancé la query, vous ne voyez pas encore votre base de données dans le panneau `Object Explorer`, pensez à le rafraîchir. Cliquez n'importe où dans le panneau et pressez `F5` ou faites un clic droit sur l'élément racine `localhost, 
> 1433` et choisissez `Refresh` dans le menu contextuel.

## Écrire un script PowerShell et se connecter à la base de données {#write-a-powershell-script-and-connect-to-the-database}

*Ce n'est probablement pas la meilleure façon d'interroger une base SQL Server, l'exemple vient de Stack Overflow\... Si vous êtes plutôt du genre Excel, voyez [MS Excel - Connect to a SQL Server database, run a query and get the results](/blog/vba-excel-sql-server).*

Comme exemple, nous allons créer un script PowerShell appelé `connect.ps1` pour illustrer comment interroger notre nouvelle base de données :

**connect.ps1**

```ps1
$SqlServer = 'localhost,1433';
$SqlDatabase = 'MyDB';

$SqlConnectionString = 'Data Source={0};Initial Catalog={1};User Id=SA;Password=2Secure*Password2;' -f $SqlServer, $SqlDatabase;
$SqlQuery = "SELECT FirstName, LastName FROM dbo.Person ORDER BY LastName;";

$SqlConnection = New-Object -TypeName System.Data.SqlClient.SqlConnection -ArgumentList $SqlConnectionString;

$SqlCommand = $SqlConnection.CreateCommand();
$SqlCommand.CommandText = $SqlQuery;

$SqlConnection.Open();
$SqlDataReader = $SqlCommand.ExecuteReader();

Write-Host "Here is the content of dbo.Person"
Write-Host "---------------------------------"
Write-Host ""

while ($SqlDataReader.Read()) {
    Write-Host $SqlDataReader['LastName'] $SqlDataReader['FirstName'];
}

$SqlConnection.Close();
$SqlConnection.Dispose();

Write-Host ""
```

Lancez une console DOS ou PowerShell et exécutez cette commande : `powershell -executionpolicy bypass -File .\connect.ps1`.

![Exécution du script PowerShell](./images/run_powershell.webp)

Nous avons maintenant validé que votre base de données est fonctionnelle et accessible. À vous de vous approprier cet exemple !
