2013-12-12 40 views
0

朋友...动态SQL不工作在恢复数据库版本2008

锇:WIN2K3

DB:SQL Server 2008中

我打算从生产恢复最新的备份集测试D b。我必须从恢复headeronly命令获取最大位置到一个变量,并将其传递给恢复命令。

我已经写了这个查询..但我仍然面临执行此查询中的一些问题。

declare @position1 as int 

declare @tempsql1 nvarchar(max) 

set @tempsql1='RESTORE HEADERONLY FROM DISK = ''D:\DailyDBbackup\ciet.BAK'''; 

execute(@tempsql1); ======== upto this statement working fine... 

SELECT @position1 = MAX(position) FROM @tempsql1 WHERE BackupType = 1 AND BackupName = 'ciet-Full Database Backup'; 

这里@tempsql1没有从上述变量中​​获得值。我正在错误的

必须声明表变量 “@ tempsql1”

RESTORE DATABASE ciet FROM DISK = 'D:\DailyDBbackup\ciet.BAK' 
WITH FILE = @position1; 

有谁能够纠正这一错误?

感谢&问候

我试图像下面的查询......但同样其恢复旧的备份集不是最大的。

DECLARE @position1 int; 
DECLARE @BackupHeader TABLE (
     BackupName nvarchar(128) 
     ,BackupDescription nvarchar(255) 
     ,BackupType smallint 
     ,ExpirationDate datetime 
     ,Compressed tinyint 
     ,Position smallint 
     ,DeviceType tinyint 
     ,UserName nvarchar(128) 
     ,ServerName nvarchar(128) 
     ,DatabaseName nvarchar(128) 
     ,DatabaseVersion int 
     ,DatabaseCreationDate datetime 
     ,BackupSize numeric(20,0) 
     ,FirstLSN numeric(25,0) 
     ,LastLSN numeric(25,0) 
     ,CheckpointLSN numeric(25,0) 
     ,DatabaseBackupLSN numeric(25,0) 
     ,BackupStartDate datetime 
     ,BackupFinishDate datetime 
     ,SortOrder smallint 
     ,CodePage smallint 
     ,UnicodeLocaleId int 
     ,UnicodeComparisonStyle int 
     ,CompatibilityLevel tinyint 
     ,SoftwareVendorId int 
     ,SoftwareVersionMajor int 
     ,SoftwareVersionMinor int 
     ,SoftwareVersionBuild int 
     ,MachineName nvarchar(128) 
     ,Flags int 
     ,BindingID uniqueidentifier 
     ,RecoveryForkID uniqueidentifier 
     --following columns introduced in SQL 2008 
     ,Collation nvarchar(128) 
     ,FamilyGUID uniqueidentifier 
     ,HasBulkLoggedData bit 
     ,IsSnapshot bit 
     ,IsReadOnly bit 
     ,IsSingleUser bit 
     ,HasBackupChecksums bit 
     ,IsDamaged bit 
     ,BeginsLogChain bit 
     ,HasIncompleteMetaData bit 
     ,IsForceOffline bit 
     ,IsCopyOnly bit 
     ,FirstRecoveryForkID uniqueidentifier 
     ,ForkPointLSN numeric(25,0) 
     ,RecoveryModel nvarchar(60) 
     ,DifferentialBaseLSN numeric(25,0) 
     ,DifferentialBaseGUID uniqueidentifier 
     ,BackupTypeDescription nvarchar(60) 
     ,BackupSetGUID uniqueidentifier NULL 
     ,CompressedBackupSize bigint 
     --following column introduced in SQL 2012 
     --,Containment tinyint 
    ) 

INSERT INTO @BackupHeader 
    EXEC ('RESTORE HEADERONLY FROM DISK=''D:\DailyDBbackup\121213\ciet.BAK'''); 

--print @BackupHeader; ==== it shows error so i commented 

SELECT @position1 = MAX(position) 
FROM @BackupHeader 
WHERE 
    BackupType = 1 
    AND BackupName = 'ciet-Full Database Backup'; 

print @position1; ==== here it shows the first position that is 1...max position is 18 

IF @position1 IS NULL 
BEGIN 
    RAISERROR('Backup not found', 16, 0); 
END 
ELSE 
BEGIN 
    RESTORE DATABASE ciet FROM DISK = 'D:\DailyDBbackup\121213\ciet.BAK' 
     WITH FILE = @position1; 
END; 
+0

你'@ tempsql1'变量只是一个简单的nvarchar的值。你不能做一个'SELECT ... FROM @ tempsql1',因为不可能从一个简单的nvarchar值中进行选择。 – Dan

+0

你期待在@tempsql中有什么? – PCG

回答

0

的错误信息是很清楚的 - 你不能使用@ tempsql1这样的方式,是不是一个表变量。

有没有简单的方法,把一个选择SQL到变量,然后到子句。

如果由动态SQL生成 - 阅读本简要指南

http://www.sommarskog.se/dynamic_sql.html

相关问题