SQL Server 2012 的改动

众所周知,SQL Server 2012最大的新功能是“Allways ON”,其实除了这个以外,在一些内部的功能和DMV上也做了较大的改进,这里罗列了大部分,希望对即将升级的朋友们有些帮助。

功能变更

功能名称

原有的功能

解决方法

BACKUP DATABASE 或 LOG WITH PASSWORD
BACKUP DATABASE 或 LOG WITH MEDIAPASSWORD

RESTORE { DATABASE | LOG } WITH [MEDIA]PASSWORD 继续不推荐使用。
BACKUP { DATABASE | LOG } WITH PASSWORD 和 BACKUP { DATABASE | LOG } WITH MEDIAPASSWORD 已不再使用

Backup 和 Restore

RESTORE { DATABASE | LOG } … WITH DBO_ONLY

RESTORE { DATABASE | LOG } … … WITH RESTRICTED_USER

配置选项

sp_configure 'user instance timeout' 与'user instances enabled'

使用本地数据库功能

数据库选项

sp_dboption

ALTER DATABASE

元数据

DATABASEPROPERTY

DATABASEPROPERTYEX

查询提示

FASTFIRSTROW 提示

OPTION (FAST n)

安全性

sp_dropalias

请将别名替换为用户帐户和数据库角色的组合。 请使用 sp_dropalias 删除已升级数据库中的别名。

SET 选项

SET DISABLE_DEF_CNST_CHK

系统表

sys.database_principal_aliases

请使用角色而不是别名

Transact-SQL

格式为 RAISERROR integer 'string' 的 RAISERROR 不再使用

请使用当前的 RAISERROR(…) 语法重写语句

Transact-SQL 语法

COMPUTE / COMPUTE BY

使用 ROLLUP

Transact-SQL 语法

*= 和 =* 用法

使用 ANSI 联接语法

XEvents

databases_data_file_size_changed、databases_log_file_size_changed
eventdatabases_log_file_used_size_changed
locks_lock_timeouts_greater_than_0
locks_lock_timeouts

替换为 database_file_size_change event、database_file_size_change
database_file_size_change 事件
lock_timeout_greater_than_0
lock_timeout

从名为 NEXT 的列或表中进行选择

序列使用 ANSI 标准 NEXT VALUE FOR 函数。 如果表或列名为 NEXT 且该表或列的别名为 VALUE,在省略 ANSI 标准 AS 的情况下,所得到的语句可能会导致错误。

若要解决这个问题,请包括 ANSI 标准 AS 关键字。 例如,SELECT NEXT VALUE FROM Table 应被重写为 SELECT NEXT AS VALUE FROM Table,SELECT Col1 FROM NEXT VALUE 应被重写为 SELECT Col1 FROM NEXT AS VALUE。

PIVOT 运算符

当数据库兼容级别设置为 110 时,不允许在递归公用表表达式 (CTE) 查询中使用 PIVOT 运算符。

重写该查询,或将兼容级别设置为 100 或更低。 当每个分组有多个行时,在递归 CTE 查询中使用 PIVOT 会产生不正确的结果。

sp_setapprole 和 sp_unsetapprole

sp_setapprole 的 cookie OUTPUT 参数当前记载为 varbinary(8000),这是正确的最大长度。 但是,当前实现返回 varbinary(50)。 应用程序应继续保留 varbinary(8000),以便当 cookie 在将来的版本中返回大小增量时,应用程序可继续正确运行。 有关详细信息,请参阅 sp_setapprole (Transact-SQL)。

 

sys.fn_get_audit_file 函数

添加了两个新列(user_defined_event_id 和 user_defined_information)来支持用户定义的审核事件

 

WITHIN 保留关键字

WITHIN 现在是保留关键字。 引用名为“within”的对象或列将失败。

重命名对象或列,或通过使用括号或引号来分隔名称。 例如,SELECT * FROM [within]。

对类型为 time 或 datetime2 的计算列的 CAST 和 CONVERT 操作

在 SQL Server 的早期版本中,对 time 或 datetime2 数据类型的 CAST 和 CONVERT 操作的默认样式为 121,当在计算列表达式中使用这些类型时除外。 对于计算列,默认样式为 0。 当创建用于涉及自动参数化的查询中或约束定义中的计算列时,此行为会影响计算列。

兼容级别为 110 时,对 time 和 datetime2 数据类型的 CAST 和 CONVERT 操作的默认样式始终为 121。 如果您的查询依赖旧行为,请使用低于 110 的兼容级别或在受影响的查询中显式指定 0 样式。
将数据库升级到兼容级别 110 将不更改已存储到磁盘的用户数据。 您必须相应手动更正此数据。 例如,如果您使用了 SELECT INTO 来从包含上述计算列表达式的源创建表,将存储数据(使用样式 0)而非存储计算列定义本身。 您需要手动更新此数据,以匹配样式 121。

ALTER TABLE

ALTER TABLE 语句只允许两部分的表名 (schema.object)。 使用以下格式指定表名时,现在在编译时会失败,出现错误 117。
server.database.schema.table
.database.schema.table
..schema.table
在早期版本中指定格式 server.database.schema.table 会返回错误 4902。 指定格式 .database.schema.table 或 ..schema.table 则会成功。

要解决此问题,请不要使用 4 部分的前缀。

浏览元数据

使用 FOR BROWSE 或 SET NO_BROWSETABLE ON 查询视图时,现在会返回视图的元数据而非基础对象的元数据。 此行为现在匹配浏览元数据的其他方法。

SOUNDEX

数据库兼容级别为 110 时,SOUNDEX 函数实现的新规则可能导致由该函数计算的值不同于更低数据库兼容级别下计算的值。

在升级到兼容级别 110 后,可能需要重新生成使用 SOUNDEX 函数的索引、堆或 CHECK 约束。

失败的 DML 语句的行计数消息

在 SQL Server 的早期版本中,当 TRY-CATCH 块包含失败的 DML 语句并且该语句由数据库引擎自动参数化或 TRY-CATCH 块所处的级别不同于失败语句的级别时,会向客户端发送不正确的值 -1。 例如,如果 TRY-CATCH 块调用存储过程且该过程中的 DML 语句失败,客户端将错误地收到 -1 值。
依赖这种不正确行为的应用程序将失败。

在 SQL Server 2012 中,DML 语句失败时,数据库引擎将以一致方式将包含 RowCount: 0 的 TDS DONE 令牌发送到客户端

SERVERPROPERTY (‘Edition’)

 

所安装的 SQL Server 2012 实例的产品版本。 使用该属性的值确定已安装的产品支持的功能和限制(如最大 CPU 数)。
基于安装的 Enterprise 版,它可以返回“Enterprise Edition”或“Enterprise Edition:基于内核授予许可”。 根据单个 SQL Server 实例的最大计算能力来区分 Enterprise 版本。 有关 SQL Server 2012 中计算能力限制的详细信息,请参阅按 SQL Server 版本划分的计算能力限制。

CREATE LOGIN

CREATE LOGIN WITH PASSWORD = 'password' HASHED 选项不能用于 SQL Server 7 或更早版本创建的哈希。

 

视图修改

视图名

原列名或类型

修改后列名或类型

sys.dm_exec_requests

nvarchar(16)

nvarchar(32)

sys.dm_os_memory_cache_counters

single_pages_kb

pages_kb

sys.dm_os_memory_cache_counters

multi_pages_kb

pages_in_use_kb

sys.dm_os_memory_cache_entries

pages_allocated_count

pages_kb

sys.dm_os_memory_clerks

列 multi_pages_kb 已删除

 

sys.dm_os_memory_clerks

single_pages_kb

pages_kb

sys.dm_os_memory_nodes

pages_allocated_count

pages_in_bytes

sys.dm_os_memory_nodes

max_pages_allocated_count

max_pages_in_bytes

sys.dm_os_sys_info

physical_memory_in_bytes

physical_memory_kb

sys.dm_os_sys_info

bpool_commit_target

committed_target_kb

sys.dm_os_sys_info

bpool_visible

visible_target_kb

sys.dm_os_sys_info

virtual_memory_in_bytes

virtual_memory_kb

sys.dm_os_sys_info

bpool_commited

committed_kb

sys.dm_os_workers

区域设置列已删除。

 

sys.data_spaces
sys.partition_schemes
sys.filegroups
sys.partition_functions

 

已将新列 is_system 添加到 sys.data_spaces 和 sys.partition_functions。 (sys.partition_schemes 和 sys.filegroups 将继承 sys.data_spaces 的列。)
此列中的值 1 指示该对象用于全文索引片段。
在 sys.partition_functions、sys.partition_schemes 和 sys.filegroups 中,新列不是最后一列。 请修改依赖于从这些目录视图中返回的列顺序的现有查询。

posted @ 2013-07-20 09:06  我是 SQLDBA  阅读(554)  评论(0编辑  收藏  举报