【问题标题】:Setting ANSI Padding OFF with ALTER使用 ALTER 设置 ANSI 填充关闭
【发布时间】:2017-05-26 13:48:24
【问题描述】:
我需要在不创建新表的情况下将表的现有字段上的 ANSI PADDING 从 ON 变为 OFF。有没有办法通过 ALTER 命令来做到这一点?
谢谢!
【问题讨论】:
-
而且documentation很清楚:“这个设置只影响新列的定义。列创建后,SQL Server根据创建列时的设置存储值。现有列不受以后对此设置的更改的影响。"
标签:
sql
sql-server
ssms
ssms-2012
【解决方案1】:
不,仅使用ALTER 是无法做到这一点的。与标识属性、排序规则和其他一些位一样,列是否应用 ANSI 填充并不是事后可以更改的。
您仍然可以在不完全创建新表的情况下执行此操作,但不能不创建新列:
BEGIN TRANSACTION;
SET ANSI_PADDING OFF;
ALTER TABLE T ADD C_badpad CHAR(16) NULL;
EXEC('UPDATE T SET C_badpad = C;')
EXEC sp_rename 'T.C', 'C_old';
EXEC sp_rename 'T.C_badpad', 'C';
EXEC('ALTER TABLE T DROP COLUMN C_old;')
ROLLBACK; -- COMMIT;
但是,如果您重视自己的理智,请不要这样做。重写需要这样做的客户端代码,以便它自己进行适当的修剪,因为将ANSI_PADDING 设置为OFF 的能力已被弃用,这是有充分理由的。如今,几乎所有东西都认为ANSI_PADDING 是ON,因此将OFF 用于特定列很可能会破坏不期望它的客户。即使你认为你现在正在解决一个问题,你也可能会在未来遇到更大的问题。
ANSI_PADDING 仅作为对非常旧的软件的兼容性调整,这些软件根本不知道更好(并且可能希望使用ANSI_PADDING = OFF 创建整个数据库)。不要在新的开发中使用它,当然也不要只将它用于一列。