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.

Instructiefilmpjes

Korte filmpjes van een paar minuten, gegroepeerd per onderwerp. Je hoeft ze niet op volgorde te kijken.

Aan de slag

3 filmpjes

Wat je krijgt en hoe je het openmaakt. Begin hier als dit je eerste bestelling is.

3 minBinnenkort
Wat zit er in je download?Een rondleiding door het bestand: welke kolommen erin staan, wat de reeksvelden van Brons betekenen en waarin Zilver en Goud verschillen.
2 minBinnenkort
Downloaden en uitpakkenDe downloadlink uit je mail of account gebruiken, het zip-bestand uitpakken en controleren of het bestand compleet is.
4 minBinnenkort
Welke route past bij jou?Database, Power BI, Excel of een eigen applicatie: welke aanpak past bij je situatie en welk filmpje je daarna moet kijken.

Installeren in SQL Server

6 filmpjes

De meest gebruikte route. Van voorbereiding tot een gevulde, geïndexeerde tabel.

5 minBinnenkort
PowerShell voorbereiden en rechten instellenPowerShell als administrator starten, de module SqlServer installeren, en het account de rechten db_owner en bulkadmin geven. Ook wat je doet bij foutmelding 4861.
6 minBinnenkort
Brons inlezenHet script aanpassen, draaien en controleren. Daarna een voorbeeldquery die met BETWEEN op een huisnummerreeks zoekt.
9 minBinnenkort
Zilver en Goud inlezenRuim 9 miljoen rijen laden zonder dat het uren duurt: recovery model op SIMPLE, ruimte vooraf reserveren en pas na het laden indexeren.
5 minBinnenkort
De selectiebestanden van Goud gebruikenDe losse bestanden per provincie, gemeente en plaats in één lus inlezen en aan de hoofdtabel koppelen.
7 minBinnenkort
De maandelijkse update automatiserenHet script inplannen als taak of SQL Agent-job, de nieuwe versie inladen in een tijdelijke tabel en pas omwisselen als het aantal rijen klopt.
6 minBinnenkort
Postcodetabel op Azure SQLWaarom BULK INSERT vanaf een lokaal pad daar niet werkt, en hoe je het bestand via Blob Storage met een SAS-token of met bcp laadt.

Andere systemen

3 filmpjes

Draai je geen SQL Server, of wil je de import onderweg bewerken?

6 minBinnenkort
Inlezen in MySQL en PostgreSQLLOAD DATA INFILE en COPY naast elkaar, inclusief de instellingen voor UTF-8 en de puntkomma als scheidingsteken.
11 minBinnenkort
Een SSIS-pakket bouwenStap voor stap een herbruikbaar importpakket, met de instellingen die bij Nederlandse adresdata vaak misgaan: code page 65001, rijafsluiting {CR}{LF} en te krappe kolomlengtes.
4 minBinnenkort
Excel en Power Query zonder verminkte postcodesWaarom dubbelklikken van 1011 AB een datum maakt, en hoe je dat voorkomt met Gegevens, Uit tekst/CSV en het gegevenstype Tekst.

Gebruiken in Power BI

5 filmpjes

Van tabel naar rapport: koppelen, verrijken en op de kaart tonen.

5 minBinnenkort
De postcodetabel koppelenHet bestand of de database als bron toevoegen, de kolomtypes goed zetten en de postcodekolom op tekst houden zodat er niets verandert.
6 minBinnenkort
Relatie met je eigen klantbestandKlanten op postcode en huisnummer koppelen aan de adrestabel, en zichtbaar maken welke rijen geen match hebben.
7 minBinnenkort
Adressen op een kaartvisualDe coördinaten uit de tabel gebruiken in de kaartvisual, in plaats van Power BI zelf te laten raden waar een plaatsnaam ligt.
8 minBinnenkort
Een dashboard per postcodegebiedOmzet en klanten samenvatten per PC4, gemeente en provincie, met een slicer waarmee je door de niveaus zakt.
4 minBinnenkort
Maandelijks verversenDe gegevensbron zo instellen dat de nieuwe maandversie automatisch wordt opgehaald zonder dat je het rapport hoeft aan te passen.

Toepassingen

3 filmpjes

Wat je met de data doet als hij eenmaal draait.

9 minBinnenkort
Adres automatisch aanvullen in een formulierEen klein voorbeeld waarin postcode en huisnummer straat en plaats invullen, met een query die snel genoeg is om tijdens het typen te draaien.
7 minBinnenkort
Je klantbestand opschonenBestaande adressen tegen de tabel leggen: welke bestaan niet meer, welke hebben een verkeerde plaatsnaam, en welke zijn dubbel.
6 minBinnenkort
Rayons en rittenplanningMet de coördinaten werkgebieden indelen op rijafstand in plaats van op postcodecijfers, en de resultaten teruglezen in je eigen systeem.

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 450.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 450.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.