SQL Server ANSI_Padding

Mik*_*son 17 sql-server

如果我右键单击SQL Server Management Studio中的表并选择"脚本表为>创建到>新查询编辑器窗口",则显示的代码包含:

SET ANSI_PADDING ON

....创建表...

SET ANSI_PADDING OFF

所以,我想,ANSI_Padding是打开还是关闭会影响整个数据库,它是否会打开以创建一个表然后再关闭?

如果您创建一个ANSI_Padding关闭的表,会发生什么?你如何为那张桌子打开它?

Mit*_*eat 14

SET ANSI_PADDING控制列中存储值大于所定义的列的尺寸短的方式的方式,以及列中存储有在尾随空白值char,varchar, binary,和varbinary数据.

MicrosoftSQL Server 的未来版本中,ANSI_PADDING将始终为ON,并且将选项明确设置为OFF的任何应用程序都将产生错误.避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序.

此设置仅影响列的定义.创建列后,SQL Server会根据创建列时的设置存储值.以后更改此设置不会影响现有列.


SQL*_*ace 6

所以,我想,ANSI_Padding是打开还是关闭会影响整个数据库,它是否会打开以创建一个表然后再关闭?

不,SET选项仅影响连接的上下文,如果有2个连接进入,一个连接有ANSI_PADDING而另一个连接ON,它们不影响另一个连接.但是....在一个连接中创建的表将具有该设置对其执行的行为.

在这里阅读更多信息http://msdn.microsoft.com/en-us/library/ms190356.aspx

因此,如果连接1进入set ansi_nulls off,那么select * from bla where col = null将起作用

但是,如果它带有默认的ansi_nulls设置(ON),则不适用于连接2

您可以通过执行dbcc useroptions或者如果您在2005年及以后查看您的设置

SELECT SPID,VALUE,ANSI_SETTING
FROM (
SELECT @@SPID AS SPID,
CASE quoted_identifier
WHEN 1 THEN 'SET' ELSE 'OFF' END QUOTED_IDENTIFIER,
CASE arithabort
WHEN 1 THEN 'SET' ELSE 'OFF' END ARITHABORT,
CASE ansi_null_dflt_on
WHEN 1 THEN 'SET' ELSE 'OFF' END ANSI_NULL_DFLT_ON,
CASE ansi_defaults
WHEN 1 THEN 'SET' ELSE 'OFF' END ANSI_DEFAULTS ,
CASE ansi_warnings
WHEN 1 THEN 'SET' ELSE 'OFF' END ANSI_WARNINGS,
CASE ansi_padding
WHEN 1 THEN 'SET' ELSE 'OFF' END ANSI_PADDING,
CASE ansi_nulls
WHEN 1 THEN 'SET' ELSE 'OFF' END ANSI_NULLS,
CASE concat_null_yields_null
WHEN 1 THEN 'SET' ELSE 'OFF' END CONCAT_NULL_YIELDS_NULL
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID ) P
UNPIVOT (VALUE FOR ANSI_SETTING IN(
QUOTED_IDENTIFIER,ARITHABORT,ANSI_NULL_DFLT_ON,
ANSI_DEFAULTS,ANSI_WARNINGS,
ANSI_PADDING,ANSI_NULLS,CONCAT_NULL_YIELDS_NULL
)
) AS unpvt
Run Code Online (Sandbox Code Playgroud)