SQL Server中几个重要的SET OPTION,非必要不建议修改

目录

为何写这个话题?因为项目中出现过几次有开发者copy之前的release脚本,没注意到其中的set option的影响,最终造成release报错的情况。
SQL Server中以下两个 SET OPTION 在非必要的情况下均设为ON,可以避免很多意外。

SET ANSI_PADDING ON

此选项默认即为ON,且微软文档中推荐此选项应一直为 ON,且新版本将不支持设为 OFF.
若设置为 OFF,会影响新建表的 varchar 等可变长度类型,新增数据时会自动将结尾的空格或0去掉,出现想插入的值和实际存储的值不一致的现象,而这是不合理的。 一些特殊情况下也会有影响,比如:

  • 创建filtered index或在computed column上创建index情形下,此 optiion 要为 ON。
  • 为分区表创建同结构的staging表用于后续switch时,此选项要和创建原分区表时保持一致。

SET QUOTED_IDENTIFIER ON

在创建 filtered index 或 使用XML相关方法(xQuery等)时此选项必须为 ON。

注: Windows上的SQLCMD此选项默认为OFF,而SSMS默认为ON

其它参考

SET ANSI_DEFAULTS ON

为了方便保持一致,一些常见的ISO选项可用 SET ANSI_DEFAULTS ON 统一设置,相当于以下选项均设置为 ON:

SET ANSI_NULLS    
SET ANSI_WARNINGS    
SET ANSI_NULL_DFLT_ON    
SET CURSOR_CLOSE_ON_COMMIT    
SET ANSI_PADDING    
SET IMPLICIT_TRANSACTIONS    

查看当前session options

DBCC USEROPTIONS

本人常用的另外两个set option

  • 不发送 xxx rows affected 给客户端
  • 出错后马上停止执行
SET NOCOUNT ON;
SET XACT_ABORT ON;

以上仅为推荐的常用做法,SET option可根据实际情况进行设置,更多关于SET OPTION 的说明可查看官方文档