【问题标题】: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_PADDINGON,因此将OFF 用于特定列很可能会破坏不期望它的客户。即使你认为你现在正在解决一个问题,你也可能会在未来遇到更大的问题。

ANSI_PADDING 仅作为对非常旧的软件的兼容性调整,这些软件根本不知道更好(并且可能希望使用ANSI_PADDING = OFF 创建整个数据库)。不要在新的开发中使用它,当然也不要只将它用于一列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-22
    • 2020-10-25
    • 2011-04-13
    • 1970-01-01
    • 2021-09-24
    • 2014-01-25
    • 1970-01-01
    • 2015-04-12
    相关资源
    最近更新 更多