SQL 2005 语句迁移到2008 报错

hokor 2010-08-13 03:24:12
下面语句用户收缩一个实例下的所有用户数据库。
在SQL 2005 运行正常,但是在SQL 2008 下执行报语法错误。
DECLARE @name VARCHAR(25)--数据库名  

DECLARE @SQL VARCHAR(1000)
DECLARE @logid INT
DECLARE database_name CURSOR
FOR SELECT name FROM master.dbo.sysdatabases where dbid >6
OPEN database_name
FETCH NEXT FROM database_name INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN
SET @SQL ='DECLARE @logid INT
USE ' + @name+'
SELECT @logid = fileid FROM sysfiles WHERE RIGHT(rtrim(filename),3) = ''ldf''
BACKUP LOG ' + @name+' WITH NO_LOG
DUMP TRANSACTION ' + @name+' WITH NO_LOG
DBCC SHRINKFILE (@logid) '
EXEC(@SQL)

END
FETCH NEXT FROM database_name INTO @name
END

CLOSE database_name
DEALLOCATE database_name

上面执行报错如下:
'DUMP' 附近有语法错误。
Msg 319, Level 15, State 1, Line 5
关键字 'with' 附近有语法错误。如果此语句是公用表表达式、xmlnamespaces 子句或者更改跟踪上下文子句,那么前一个语句必须以分号结尾。
Msg 102, Level 15, State 1, Line 5


use master
go
dump TRANSACTION master WITH NO_LOG
GO
BACKUP LOG master WITH NO_LOG
go

单独在SQL 2008 执行上面语句报错如下:
Msg 156, Level 15, State 1, Line 1
关键字 'TRANSACTION' 附近有语法错误。
Msg 3032, Level 16, State 2, Line 1
此语句不支持一个或多个选项(no_log)。请查阅文档以了解所支持的选项。


了解2008 语法的 帮忙改一下。
要实现批量收缩一个实例下的所有数据库功能。
...全文
491 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
claro 2010-08-13
  • 打赏
  • 举报
回复
本主题介绍 SQL Server 2008 中不再可用的数据库引擎功能。

类别 废止的功能 替代功能
别名 sp_addalias 将别名替换为用户帐户和数据库角色的组合。有关详细信息,请参阅 CREATE USER (Transact-SQL) 和 CREATE ROLE (Transact-SQL)。使用 sp_dropalias 删除已升级数据库中的别名。

API 已注册服务器的 API 已经替换为新的支持新 SQL Server 2008 功能的已注册服务器 API。

备份和还原 DUMP 语句 BACKUP

备份和还原 LOAD 语句 RESTORE

备份和还原 BACKUP LOG WITH NO_LOG 无。如果数据库使用的是简单恢复模式,事务日志将被自动截断。如果必须从数据库删除日志备份链,请切换到简单恢复模式。

备份和还原 BACKUP LOG WITH TRUNCATE_ONLY 无。如果数据库使用的是简单恢复模式,事务日志将被自动截断。如果必须从数据库删除日志备份链,请切换到简单恢复模式。

备份和还原 BACKUP TRANSACTION BACKUP LOG

兼容级别 60、65 和 70 兼容级别 必须将数据库的兼容级别至少设置为 80。

DBCC DBCC CONCURRENCYVIOLATION 无

组 sp_addgroup 使用角色。

组 sp_changegroup 使用角色。

组 sp_dropgroup 使用角色。

组 sp_helpgroup 使用角色。

示例数据库 Northwind 和 pubs 使用 AdventureWorks。Northwind 和 pubs 可通过下载获取,也可以从以前安装的 SQL Server 中复制。

有关详细信息,请参阅 AdventureWorks 示例数据库。

工具 外围应用配置器工具 对于 SQL Server 2008,外围应用配置器工具已废止。有关详细信息,请参阅向后兼容性。

Web 助手 sp_makewebtask 建议您改用 SQL
sp_dropwebtask
sp_runwebtask
sp_enumcodepages


claro 2010-08-13
  • 打赏
  • 举报
回复
在SQL2008中已经不允许使用DUMP和backup log 语句,详见联机丛书:SQL Server 2008 中废止的数据库引擎功能

DECLARE @name VARCHAR(25)--数据库名  

DECLARE @SQL VARCHAR(1000)
DECLARE @logid INT
DECLARE database_name CURSOR
FOR SELECT name FROM master.dbo.sysdatabases where dbid >6
OPEN database_name
FETCH NEXT FROM database_name INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN
SET @SQL ='DECLARE @logid INT
USE ' + @name+'
SELECT @logid = fileid FROM sysfiles WHERE RIGHT(rtrim(filename),3) = ''ldf''
--BACKUP LOG ' + @name+' WITH NO_LOG
--DUMP TRANSACTION ' + @name+' WITH NO_LOG
DBCC SHRINKFILE (@logid) '
EXEC(@SQL)

END
FETCH NEXT FROM database_name INTO @name
END

CLOSE database_name
DEALLOCATE database_name


Austindatabases 2010-08-13
  • 打赏
  • 举报
回复
第一步 数据库转换到simple 模式
USE [master]
GO
ALTER DATABASE [AdventureWorks] SET RECOVERY SIMPLE WITH NO_WAIT
GO

第二步

收缩数据库
USE [AdventureWorks]
GO
DBCC SHRINKDATABASE(N'AdventureWorks' )
GO

第三步

USE [master]
GO
ALTER DATABASE [AdventureWorks] SET RECOVERY FULL WITH NO_WAIT
GO


改回原来的数据库模式
Austindatabases 2010-08-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 hokor 的回复:]
下面语句用户收缩一个实例下的所有用户数据库。
在SQL 2005 运行正常,但是在SQL 2008 下执行报语法错误。

SQL code
DECLARE @name VARCHAR(25)--数据库名

DECLARE @SQL VARCHAR(1000)
DECLARE @logid INT
DECLARE database_name CURSOR
F……
[/Quote]

是的 失败是对的 sql server 2005 收缩数据库时不需要转换数据库模式,SQL SERVER 2008 则是必须的

另外 sql server 2008 抛弃了很多sql server 2005中可以使用的语句,例如backup log

所以你的脚本出错在所难免了

BACKUP LOG ' + @name+' WITH NO_LOG

问题在这句了

所以sql server 2008 需要从新编写脚本了
hokor 2010-08-13
  • 打赏
  • 举报
回复
补充一下:
要实现批量收缩一个实例下的所有数据库日志文件功能,收缩到尽可能的小,截断日志也没关系。因为是测试环境,不用考虑据恢复之类的问题。。。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧