SQL Server ANSI_Padding

时间:2010-08-25 14:33:22

标签: sql-server

如果我右键单击SQL Server Management Studio中的表并选择'Script table as>创建至>新查询编辑器窗口'显示的代码包含:

SET ANSI_PADDING ON

....创建表格......

SET ANSI_PADDING OFF

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

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

2 个答案:

答案 0 :(得分:14)

  

SET ANSI_PADDING控制方式   该列存储的值小于   列的定义大小,和   列存储值的方式   在charvarchar中有尾随空格,   binaryvarbinary数据。

     

在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