Since this is a backup you are trying to run, here is another option:
declare @dbname varchar(128),
@filedate varchar(64);
declare @diskfile varchar(256) = 'H:\Preupgrade\Backups\' + @dbname + '_' + @filedate;
declare @filename varchar(256) = @dbname + @filedate;
declare @SQLCmd varchar(max) =
'BACKUP DATABASE @dbname
TO DISK = @diskfile
WITH NOFORMAT,
NAME = @filename,
SKIP,
REWIND,
NOUNLOAD,
STATS = 10;';
declare @params @varchar(max) = '@dbname varchar(128), @diskfile varchar(64), @filename varchar(256)';
exec sp_executesql
@SQLCmd,
@dbname = @dbname,
@diskfile = @diskfile,
@filename = @filename;