SQL Server 2012 的改动
众所周知,SQL Server 2012最大的新功能是“Allways ON”,其实除了这个以外,在一些内部的功能和DMV上也做了较大的改进,这里罗列了大部分,希望对即将升级的朋友们有些帮助。
功能变更
功能名称 | 原有的功能 | 解决方法 |
BACKUP DATABASE 或 LOG WITH PASSWORD | RESTORE { DATABASE | LOG } WITH [MEDIA]PASSWORD 继续不推荐使用。 | 无 |
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 | 替换为 database_file_size_change event、database_file_size_change |
从名为 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 样式。 |
ALTER TABLE | ALTER TABLE 语句只允许两部分的表名 (schema.object)。 使用以下格式指定表名时,现在在编译时会失败,出现错误 117。 | 要解决此问题,请不要使用 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 数)。 | |
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 | 已将新列 is_system 添加到 sys.data_spaces 和 sys.partition_functions。 (sys.partition_schemes 和 sys.filegroups 将继承 sys.data_spaces 的列。) |