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 的说明可查看官方文档