使用SQL Server 2012.我需要在不使用游标或临时表的情况下遍历我的表。另外,我知道辩论了:游标...... :)我在这个问题的底部有脚本使用sys.databases和msdb.dbo.restorehistory获取最后一次恢复,但这并没有解决我的迫切需要对于这个特定的表格。
场景:我有一个我为恢复测试创建的表:
CREATE Table RestoreTests (
RestoreTestID int Not NULL,
ServerName varchar (255) Not NULL,
DatabaseName varchar (255) Not NULL,
RestoreDate datetime Not NULL,
BackupFile varchar (1000) Not NULL)
我插入了8条记录:
我想识别我桌上的所有> 30天。
SELECT * FROM RestoreTests WHERE RestoreDate DATEDIFF(Day,RestoreDate, GETDATE()) > 30
我的语法:
declare @RestoreTestID int
declare @ServerName varchar(255)
declare @DatabaseName varchar(255)
declare @RestoreDate datetime
declare @BackupFile varchar(1000)
declare @id int
set @id = 0
select top 1 @RestoreTestID = RestoreTestID,
@ServerName = ServerName,
@DatabaseName = DatabaseName,
@RestoreDate = RestoreDate,
@BackupFile = BackupFile
from dbo.RestoreTests
where RestoreTestID > @id and DATEDIFF(DAY,RestoreDate, GETDATE()) > 30
order by RestoreTestID asc
while @@ROWCOUNT > 0
begin
print 'loop RestoreTestID=' + cast(@RestoreTestID as varchar(255)) +
', ServerName=' + @ServerName +
', DatabaseName' + @DatabaseName +
', RestoreDate' + CAST(@RestoreDate as varchar(255)) +
', BackupFile' + @BackupFile
set @id = @RestoreTestID
select top 1 @RestoreTestID = RestoreTestID
from dbo.RestoreTests
where RestoreTestID > @id and DATEDIFF(DAY,RestoreDate, GETDATE()) > 30
order by RestoreTestID
端
我收到错误讯息: Msg 137,Level 15,State 1,Line 1 必须声明标量变量" @ RestoreTestID"。 Msg 137,Level 15,State 2,Line 13 必须声明标量变量" @ RestoreTestID"。 Msg 137,Level 15,State 2,Line 19 必须声明标量变量" @ RestoreTestID"。 Msg 137,Level 15,State 1,Line 21 必须声明标量变量" @ RestoreTestID"。
当我在早些时候徘徊时,我确实得到了所有8个记录的结果集,而不是超过30天的4个记录。非常感谢任何提供的帮助!!
Last Restore Syntax:
WITH LastRestores AS
(
SELECT
DatabaseName = [d].[name] ,
[d].[create_date] ,
[d].[compatibility_level] ,
[d].[collation_name] ,
r.*,
RowNum = ROW_NUMBER() OVER (PARTITION BY d.Name ORDER BY r.[restore_date] DESC)
FROM master.sys.databases d
LEFT OUTER JOIN msdb.dbo.[restorehistory] r ON r.[destination_database_name] = d.Name
)
SELECT *
FROM [LastRestores]
WHERE [RowNum] = 1
select * from [dbo].[RestoreTests]
答案 0 :(得分:0)
好的,我想出了我需要的东西。这是我到达的语法:
declare @RestoreTestID int
declare @id int
declare @ServerName varchar(255);
declare @DatabaseName varchar (255);
declare @RestoreDate datetime;
declare @BackupFile varchar (1000);
set @id = 0
select top 1
@RestoreTestID = RestoreTestID,
@ServerName = ServerName,
@DatabaseName = DatabaseName,
@RestoreDate = RestoreDate,
@BackupFile = BackupFile
from dbo.RestoreTests
where RestoreTestID > @id and RestoreDate <= DATEADD(day,-31,getdate())
order by RestoreTestID
while @@ROWCOUNT = 1
begin
print 'RestoreTestID = ' + cast(@RestoreTestID as varchar(255)) +
', ServerName = ' + @ServerName +
', Databasename = ' + @DatabaseName +
', RestoreDate = ' + cast(@RestoreDate as varchar (255)) +
', BackupFile = ' + @BackupFile
set @id = @RestoreTestID
select top 1 @RestoreTestID = RestoreTestID
from dbo.RestoreTests
where RestoreTestID > @id and RestoreDate <= DATEADD(day,-31,getdate())
order by RestoreTestID
end