De postcodetabel installeren

Van gedownload CSV-bestand naar een werkende tabel in je eigen database. Kom je er niet uit? Neem contact op of gebruik de chat rechtsonder.

Wil je de adressen op een kaart zien? Lees hoe je de postcodetabel opent in RustGIS.

De postcodetabel inlezen in je eigen systeem

Alle bestanden zijn CSV, puntkomma-gescheiden, UTF-8 gecodeerd, met een leesbare kopregel. Hieronder staat per pakket een compleet PowerShell-script dat de tabel aanmaakt, het bestand laadt en de indexen zet. Vervang bovenin het pad, de server en de databasenaam en je kunt draaien.

Voordat je begint
1Start PowerShell als administrator. Klik met rechts op Windows PowerShell en kies "Als administrator uitvoeren". Zonder verhoogde rechten kan SQL Server het bestand niet openen en krijg je foutmelding 4861.
2Geef het account voldoende databaserechten. Het account waarmee je verbindt moet db_owner zijn op de doeldatabase (of minimaal CREATE TABLE, ALTER en INSERT) en de serverrol bulkadmin hebben, oftewel het recht ADMINISTER BULK OPERATIONS.
3Zorg dat SQL Server bij het bestand kan. Bij BULK INSERT leest de SQL Server-service het bestand zelf, niet jouw gebruikersaccount. Zet het CSV-bestand op een lokale schijf van de server, of geef het serviceaccount leesrechten op de netwerkmap.
4Installeer de module SqlServer. De scripts controleren dit zelf en installeren de module als die ontbreekt. Handmatig kan ook: Install-Module -Name SqlServer -Scope AllUsers.

Brons bevat de postcodetabel op reeksniveau: per postcode een begin- en eindhuisnummer. Dat is compact (ruim 600.000 rijen, enkele seconden laden) maar je zoekt met BETWEEN in plaats van op een exact huisnummer. Onderaan het script staat een voorbeeldquery.

<#
  postcode-import-brons.ps1
  Laadt de postcodetabel Brons in SQL Server.

  BELANGRIJK — start PowerShell als administrator:
    Klik met rechts op Windows PowerShell en kies "Als administrator uitvoeren".
    Zonder verhoogde rechten kan SQL Server het CSV-bestand niet openen
    en krijg je foutmelding 4861 (Cannot bulk load).

  Het account waarmee je verbindt heeft nodig:
    - db_owner op de doeldatabase (of CREATE TABLE + ALTER + INSERT)
    - de serverrol bulkadmin, of de rechten ADMINISTER BULK OPERATIONS
    - leesrechten van de SQL Server-service op de map met het CSV-bestand
#>
# --- instellingen ------------------------------------------------
$Server   = "localhost\SQLEXPRESS"
$Database = "Adresdata"
$Csv      = "C:\data\postcode-brons-2026-08.csv"
$Table    = "dbo.Postcodes"

# --- controles ---------------------------------------------------
if (-not ([Security.Principal.WindowsPrincipal] `
    [Security.Principal.WindowsIdentity]::GetCurrent()
  ).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
  Write-Error "Start PowerShell als administrator en probeer opnieuw."
  exit 1
}

if (-not (Get-Module -ListAvailable -Name SqlServer)) {
  Write-Host "Module SqlServer ontbreekt, wordt geinstalleerd..."
  Install-Module -Name SqlServer -Scope AllUsers -Force -AllowClobber
}
Import-Module SqlServer

if (-not (Test-Path $Csv)) { Write-Error "Bestand niet gevonden: $Csv"; exit 1 }
# --- SQL: tabel voor de postcodetabel op reeksniveau -------------
# Brons bevat postcodes met een huisnummerreeks: ruim 600.000 rijen.
# Let op de reeksvelden; die bestaan niet in Zilver en Goud.
$create = @"
IF OBJECT_ID('$Table') IS NOT NULL DROP TABLE $Table;
CREATE TABLE $Table (
  PostcodeVolledig       char(7)      NOT NULL,
  PostcodeNummers        smallint     NOT NULL,
  PostcodeLetters        char(2)      NOT NULL,
  Straat                 nvarchar(80) NOT NULL,
  HuisnummerRangeStart   int          NOT NULL,
  HuisnummerRangeEind    int          NOT NULL,
  Reeksindicatie         nvarchar(10) NOT NULL,  -- Even / Oneven / Gemengd
  Plaats                 nvarchar(80) NOT NULL,
  Gemeente               nvarchar(80) NOT NULL,
  Provincie              nvarchar(40) NOT NULL,
  Latitude               decimal(9,6)     NULL,
  Longitude              decimal(9,6)     NULL,
  XCoordinaat            int              NULL,
  YCoordinaat            int              NULL,
  CreatieDatum           date             NULL
);
"@

$load = @"
BULK INSERT $Table
FROM '$Csv'
WITH (
  FIRSTROW        = 2,          -- kopregel overslaan
  FIELDTERMINATOR = ';',
  ROWTERMINATOR   = '0x0d0a', -- CRLF; met 0x0a blijft er een wagenterugloop staan
  CODEPAGE        = '65001',   -- UTF-8
  TABLOCK
);
"@

# --- SQL: indexen -------------------------------------------------
# Zoeken gaat op postcode; het huisnummer valt binnen de reeks.
$index = @"
CREATE CLUSTERED INDEX IX_Postcodes_Postcode
  ON $Table (PostcodeVolledig);
CREATE NONCLUSTERED INDEX IX_Postcodes_Reeks
  ON $Table (PostcodeVolledig, HuisnummerRangeStart, HuisnummerRangeEind)
  INCLUDE (Straat, Plaats);
CREATE NONCLUSTERED INDEX IX_Postcodes_Plaats
  ON $Table (Plaats, Straat);
"@
# --- 1. tabel aanmaken -------------------------------------------
Write-Host "Tabel aanmaken..."
Invoke-Sqlcmd -ServerInstance $Server -Database $Database -Query $create

# --- 2. bestand laden --------------------------------------------
Write-Host "Bestand laden, dit kan even duren..."
$sw = [Diagnostics.Stopwatch]::StartNew()
Invoke-Sqlcmd -ServerInstance $Server -Database $Database -Query $load -QueryTimeout 0
$sw.Stop()
Write-Host ("Geladen in {0:N0} seconden." -f $sw.Elapsed.TotalSeconds)

# --- 3. indexen zetten -------------------------------------------
# Pas na het laden: dat scheelt bij grote bestanden veel tijd.
Write-Host "Indexen aanmaken..."
Invoke-Sqlcmd -ServerInstance $Server -Database $Database -Query $index -QueryTimeout 0

# --- klaar --------------------------------------------------------
$n = Invoke-Sqlcmd -ServerInstance $Server -Database $Database `
       -Query "SELECT COUNT(*) AS Rijen FROM $Table"
Write-Host ("Klaar. {0:N0} rijen in $Table." -f $n.Rijen)

# --- zoeken op postcode en huisnummer ------------------------------
# Brons kent geen losse huisnummers: je zoekt binnen de reeks.
#
#   SELECT Straat, Plaats
#   FROM   dbo.Postcodes
#   WHERE  PostcodeVolledig = '2761 GD'
#     AND  15 BETWEEN HuisnummerRangeStart AND HuisnummerRangeEind;

Vragen over de installatie

Andere vragen over bestellen, licenties of downloads? Die staan op de helppagina.

Eerst zien of het past?Download een demobestand van 1.000 rijen, met dezelfde kolommen als het volledige bestand.