2015-02-23 50 views
2

一個特定的列集ANSI_PADDING是否有可能 - 使用單一CREATE TABLE腳本 - 特定varbinaryANSI_PADDING = ON但其他設置爲ANSI_PADDING = OFF上(在同一表的不同列ANSI_PADDING ON和OFF)

例如

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

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

+0

爲什麼填充varbinary? – jarlh 2015-02-23 07:49:12

+0

我們存儲(固定長度)散列值,然後用它們來比較沿線創建的散列值。不填充值會導致不匹配,即存儲的散列!=填充不同於包含填充的當前創建的散列(默認情況下) – NubieJ 2015-02-23 09:00:19

+0

您似乎決定要做到這一點,並且您已得到答案。但它似乎是一個更好的方法來存儲正確的數據,而不是使用ANSI_PADDING作爲修復它的黑客。 – usr 2015-02-23 09:51:24

回答

2

你HACE做的兩個步驟:

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的A示例。

+0

我同意現有數據不會更新,但是肯定會填充任何新條目。 – NubieJ 2015-02-23 11:34:59

+0

如果在你的問題中你說你正在創建一個新表,現有的數據是什麼?而且,當然不是。它會按我告訴過你的方式工作。 – JotaBe 2015-02-23 20:13:44

1

這似乎也與需要現有列的工作表中被改變:

SET ANSI_PADDING ON 
GO 

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

SET ANSI_PADDING OFF 
GO 

有何評論?它似乎解決了這個問題...

+0

唯一的意見是,這是我在我的答案中解釋你的。爲什麼回答已經回答的問題?如果我的解決方案爲您工作,我可以看到它,我請求您接受它作爲正確的答案。 – JotaBe 2015-02-23 20:15:40

+0

你是對的,我的原始問題是由你回答的 - 將其標記爲這樣。在我的問題中,我沒有澄清的部分問題是如何設置現有列,而無需重新創建表。 – NubieJ 2015-02-24 07:07:14

+1

即使這應該是一個單獨的問題,我會在評論中回答(我們不應該這麼做!):只有一種更新現有列的方法:將數據複製到單獨的表中,然後刪除並重新創建該表並將數據複製回新表。這也需要重新創建關係,索引和其他限制:不要忘記去做。 – JotaBe 2015-02-24 09:03:55