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