sc create "MSSQL$%INSTANCE%" binPath= "%SQLROOT%\MSSQL\Binn\sqlservr.exe -s%INSTANCE%" start= auto reg add "HKLM\SOFTWARE\Microsoft\Microsoft SQL Server%INSTANCE%\MSSQLServer\Parameters" /v SQLArg0 /d "-s%INSTANCE%" /f net start MSSQL$%INSTANCE%

Introduction: The Portable Paradox In the world of enterprise software, "portability" is often a dirty word. Applications are expected to hook into registries, spawn Windows services, and embed themselves deeply into the operating system. Microsoft SQL Server Express—the free, entry-level version of the world’s most popular enterprise RDBMS—is the epitome of this "installed" philosophy.

Given these constraints, any "portable" solution is, by definition, a hack. However, a surprisingly robust set of hacks exists. If you search GitHub or StackOverflow for "SQL Server Express portable," you will find three distinct archetypes. Each offers a different trade-off between convenience, authenticity, and system impact. Approach 1: The User-Instance Legacy (SQL Server Express 2008–2012) Historical context, but still relevant for legacy systems.

param([string]$Action="Start") $Drive = (Get-Location).Drive.Root $InstanceName = "SQLEXPRESS" $BinPath = "$Drive\SQLExpress\MSSQL15.SQLEXPRESS\MSSQL\Binn\sqlservr.exe" $RegPath = "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\SQLEXPRESS\MSSQLServer\Parameters"

E:\SQL2019_Setup.exe /Q /ACTION=Install /FEATURES=SQLENGINE /INSTANCENAME=SQLEXPRESS /SQLSVCACCOUNT="NT AUTHORITY\NETWORK SERVICE" /AGTSVCACCOUNT="NT AUTHORITY\NETWORK SERVICE" /SQLSYSADMINACCOUNTS="BUILTIN\ADMINISTRATORS" /INSTANCEDIR="E:\SQLExpress" /SQLUSERDBDIR="E:\SQLExpress\Data" /SQLUSERDBLOGDIR="E:\SQLExpress\Logs" /TCPENABLED=1 /BROWSERSVCSTARTUPTYPE="Automatic" /IACCEPTSQLSERVERLICENSETERMS This forces all binaries, system databases, user databases, and logs onto the USB drive. Save the following PowerShell script as StartSQL.ps1 on the root of the USB drive.

if ($Action -eq "Install") sc.exe create "MSSQL $$InstanceName" binPath= " "$BinPath " -s$InstanceName" start= auto New-Item -Path $RegPath -Force elseif ($Action -eq "Remove") net stop "MSSQL $$InstanceName" 2>$null sc.exe delete "MSSQL $$InstanceName" Remove-Item -Path $RegPath -Recurse -Force -ErrorAction SilentlyContinue Write-Host "Service removed from this machine."