如果我右键单击SQL Server Management Studio中的表并选择'Script table as>创建至>新查询编辑器窗口'显示的代码包含:
SET ANSI_PADDING ON
....创建表格......
SET ANSI_PADDING OFF
所以,我猜,ANSI_Padding是打开还是关闭会影响整个数据库,它是否会打开以创建一个表然后再关闭?
如果创建一个ANSI_Padding关闭的表,会发生什么?你怎么能为那张桌子打开它?
答案 0 :(得分:14)
SET ANSI_PADDING控制方式 该列存储的值小于 列的定义大小,和 列存储值的方式 在
char
,varchar
中有尾随空格,binary
和varbinary
数据。在Microsoft SQL Server的未来版本中,ANSI_PADDING会 永远是ON和任何应用程序 明确将选项设置为OFF将 产生错误。避免使用它 新开发工作的特点,和 计划修改那些应用程序 目前正在使用此功能。
此设置仅影响 new 列的定义。创建列后,SQL Server会根据创建列时的设置存储值。 以后对此设置的更改不会影响现有列。
答案 1 :(得分:6)
所以,我猜,ANSI_Padding是打开还是关闭会影响整个数据库,它是否会打开以创建一个表然后再关闭?
不,SET选项仅影响连接的上下文,如果有2个连接进入并且一个连接有ANSI_PADDING而另一个连接ON它们不影响另一个连接。但是......在一个连接中创建的表将具有该设置对其执行的行为。
在此处阅读更多内容http://msdn.microsoft.com/en-us/library/ms190356.aspx
因此,如果连接1与set ansi_nulls关闭
然后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