Skip to content

Create a Database Snapshot with All Files

A script that generates the complete CREATE DATABASE ... AS SNAPSHOT OF statement for the current database, including all data files.

Published Feb 21, 2005

Creating a database snapshot by hand is tedious because every data file needs its own .snp entry. This script reads sys.database_files, builds the full CREATE DATABASE ... AS SNAPSHOT OF statement with a correctly named file for each one, and prints it for you to review and run. Just change @SnapshotName first.

DECLARE @SnapshotName nVarChar(128) = 'MySnapshot'
DECLARE @SnapshotCreationTSQL VARCHAR(8000) 
SELECT
    @SnapshotCreationTSQL = COALESCE(@SnapshotCreationTSQL + ', ' + CHAR(13) + CHAR(10), '')
        + ISNULL('(NAME = [' + FileID + '], FILENAME =''' + [FilePath] + '\\' + [FileName] + '_' + @SnapshotName +  '.snp' + [FileExtension] + ''')', '')
FROM
(
    SELECT
        [name] as FileID,
        REPLACE(
            RIGHT(physical_name, CHARINDEX('\\', REVERSE(physical_name)) - 1),
                '.' + RIGHT(physical_name, CHARINDEX('.', REVERSE(physical_name)) - 1),'') as [FileName],
        '.' + RIGHT(physical_name, CHARINDEX('.', REVERSE(physical_name)) - 1) as [FileExtension],
        LEFT(physical_name, LEN(physical_name) - CHARINDEX('\\', REVERSE(physical_name))) as [FilePath]
    FROM
        sys.database_files
    WHERE
        type_desc = 'ROWS'
) as DatabaseFiles
SET @SnapshotCreationTSQL =
    'CREATE DATABASE [' + @SnapshotName + '] ON ' + CHAR(13) + CHAR(10) + @SnapshotCreationTSQL + CHAR(13) + CHAR(10) + 'AS SNAPSHOT OF [' + DB_NAME() + '];'
PRINT @SnapshotCreationTSQL
An unhandled error has occurred. Reload 🗙