2010-06-29 78 views
10

我有很多(超過一千個地方)的傳統T-SQL代碼,只能將INSERT s轉換爲實用程序表中的varchar(8000)列。我們的需求已經改變,現在這個專欄需要能夠處理更大的價值。因此我需要製作該列varchar(max)。這只是一個簡單的數據列,其中沒有執行搜索,沒有索引,只有一個過程讀取它,它是INSERT,忘記了應用程序(幾乎像日誌條目)。任何隱藏的陷阱將列從varchar(8000)更改爲varchar(max)?

我打算在實際上會生成更大數據的幾個地方進行更改,並且在處理此列的單個存儲過程中進行更改。

  • 是否有任何隱藏的陷阱將一列從varchar(8000)更改爲varchar(max)
  • 將所有T-SQL字符串函數工作相同,LEN()RTRIM()SUBSTRING()
  • 誰能想象任何理由,我不得不做出那個認爲列仍然是varchar(8000)代碼什麼變化?
+0

你爲什麼不切換到文本列? – Maz 2010-06-29 14:26:08

+2

@Max有些東西你不能在TEXT列上做,你可以在VARCHAR(MAX)上執行(比如DISTINCT查詢) – 2010-06-29 14:27:22

+0

聚合函數和文本列雖然做得不太好...... – riffnl 2010-06-29 14:27:55

回答

6
  • 所有MAX類型都有小的性能損失,請參閱Performance comparison of varchar(max) vs. varchar(N)
  • 如果您的維護包括在線操作(在線索引重建),您將失去執行這些操作的可能性。 Online operations are not supported for tables with BLOB columns
    • 聚簇索引必須創建,重建或丟棄脫機當底層表包含大對象(LOB)的數據類型:圖像,NTEXT,文本,VARCHAR(最大),爲nvarchar(最大) ,varbinary(max)和xml。
    • 當表包含LOB數據類型時,可以在線創建非唯一非聚簇索引,但是這些列都不會在索引定義中用作鍵或非鍵(包含)列。用LOB數據類型列定義的非聚簇索引必須創建或離線重建。

的性能損失是真的小,所以我不會擔心。對於非常熱的必須在線操作表而言,在線重建能力的喪失可能會產生問題。除非在線操作是必須的,否則我會投票贊成並將其更改爲MAX。

2

如果你真的不需要索引,並且它是一個大的列,你應該沒問題。 Varchar(max)看起來正是你所需要的,你現有代碼的問題比你使用文本時要少。

確保測試將文本添加到現有文本的任何更新。它應該使用正常的連接,但我希望能夠證明它。

3

Crystal Reports 12(以及其他版本,據我所知)並未正確處理varchar(max),並將其解釋爲varchar(255),這會導致報表中的截斷數據。

所以,如果你使用水晶報表,這是varchar(max)的缺點。或者使用Crystal的缺點,確切地說。

請參見:
http://www.crystalreportsbook.com/Forum/forum_posts.asp?TID=5843&PID=17503
http://michaeltbeeitprof.blogspot.com/2010/05/crystal-xi-and-varcharmax-aka-memo.html