Microsoft SQL Server umožňuje export a import dat do formátu BACPAC. Jedná se v podstatě o BCP (bulk copy) formát a u menších databází se jedná o asi nejrychlejší způsob, jak ji přenést z jednoho serveru na druhý (třeba z produkce na vývojový server, kde si můžete s reálnými daty hrát beztrestně).

Export a import lze snadno dělat ze SSMQ (SQL Server Management Studio), ale vyžaduje do dost klikání. Jde to i z příkazové řádky, ale to zase vyžaduje dost psaní. Napsal jsem proto skript, který proces výrazně zjednodušuje. Zde je:

@ECHO OFF

REM -- Configuration
SET SQLPACKAGE="C:\Program Files (x86)\Microsoft SQL Server\140\DAC\bin\sqlpackage.exe"
SET SQLSERVER=.
SET FOLDER="C:\Users\Administrator\Desktop\Export"

REM -- Generate date stamp (expects Czech date format)
FOR /f "tokens=1-3 delims=. " %%a in ('DATE /T') do (SET CURRENT_DATE=%%c%%b%%a)

REM -- Ask for database name
IF "%1"=="" (
    SET /P DBNAME="Enter database name: "
) ELSE (
    SET DBNAME=%1
)

REM -- Generate file name
SET FILENAME="%FOLDER%\%DBNAME%-%CURRENT_DATE%.bacpac"

REM -- Export database to bacpac file
%SQLPACKAGE% /a:Export /ssn:%SQLSERVER% /sdn:%DBNAME% /tf:%FILENAME%

Na začátu jsou tři konfigurační proměnné:

Skript neřeší autentizaci. Předpokládá, že poběží pod účtem, který může použít integrovanou autentizaci a má odpovídající práva.

Další část vygeneruje timestamp ve formátu YYYYMMDD, který bude částí názvu souboru. Předpokládá že na serveru bude české nastavení datumu, pro anglické je třeba parsování mírně upravit.

Další část se podívá, zda byl skript volán s parametrem určujícím název databáze. Pokud ne, zeptá se na něj interaktivně.

Následující část pak na základě zjištěných údajů vytvoří název výsledného souboru, který je ve formátu NázevDB-TimeStamp.bacpac.

Poslední řádek pak provede vlastní export.

Exportní dávku je možné použít dvěma způsoby. První je, že se zavolá z příkazové řádky s parametrem určujícím název databáze. Druhý je, že se spustí bez jakýchkoliv parametrů, třeba i poklepáním. Pak se na název zeptá.