【问题标题】:Set ANSI_PADDING on a specific column (ANSI_PADDING ON and OFF in different columns of the same table)在特定列上设置 ANSI_PADDING(在同一表的不同列中设置 ANSI_PADDING ON 和 OFF)
【发布时间】:2025-12-26 17:20:15
【问题描述】:

是否可以 - 使用单个 CREATE TABLE 脚本 - 将特定的 varbinary 列设置为 ANSI_PADDING = ON 而其他列设置为 ANSI_PADDING = OFF

例如

CREATE TABLE PaddingX (
    ...
    ColumnA varbinary(max),
    ...    
    ColumnB varbinary(50)
)

我希望 ColumnA 修剪(填充 OFF),但 ColumnB 包含完整(填充)值 - 填充 ON

【问题讨论】:

  • 为什么要在 varbinary 上填充?
  • 我们存储(固定长度)哈希值,然后用于比较下线创建的哈希值。不填充值会导致不匹配,即存储的哈希 != 填充不同于当前创建的包含填充的哈希(默认情况下)
  • 你似乎下定决心要这样做,你得到了答案。但它似乎是一种更好的方法来首先存储正确的数据,而不是使用 ANSI_PADDING 作为破解来修复它。

标签: sql sql-server ddl


【解决方案1】:

您必须分两步完成:

SET ANSI_PADDING OFF
-- create the table without the columns that need ANSI padding
SET ANSI_PADDING ON
-- alter the table to add the columns that need ANDI passing

这是唯一的方法。

如果你看SET ANSI_PADDING docs的评论,你可以阅读:

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

注意:关于添加新列,您可以查看ALTER TABLE docs 的示例。

【讨论】:

  • 我同意不会更新现有数据,但肯定会填充任何新条目。
  • 如果在你的问题中你说你正在创建一个新表,那么现有的数据是什么?而且,不一定不是。它会按照我告诉你的那样工作。
【解决方案2】:

这似乎也适用于具有需要更改的现有列的​​表:

SET ANSI_PADDING ON 
GO 

ALTER TABLE [TableX] ALTER COLUMN [ColumnY] VARBINARY (50) NULL; 
GO 

SET ANSI_PADDING OFF 
GO 

有没有cmets?它似乎解决了这个问题......

【讨论】:

  • 唯一的评论是,这就是我在回答中向您解释的内容。为什么要回答已经回答的问题?如果我的解决方案对您有用,正如我所看到的那样,我请求您接受它作为正确答案。
  • 你是对的,我原来的问题是由你回答的 - 将它标记为这样。我的部分问题(我没有在问题中澄清)是如何在不重新创建表的情况下设置现有列。
  • 即使这应该是一个单独的问题,我也会在评论中回答(我们不应该这样做!):更新现有列的方法只有一种:将数据复制到一个单独的表,删除并重新创建表并将数据复制回新表。这还需要重新创建关系、索引和其他约束:不要忘记这样做。
  • 我 100% 同意你的看法——因此我之前的评论“我同意不会更新现有数据,但肯定会填充任何新条目”由于我们目前的情况,这个问题可能更复杂我不能分享全部细节,但答案肯定有助于解决具体问题。