代码之家  ›  专栏  ›  技术社区  ›  KM.

是否存在将列从varchar(8000)更改为varchar(max)的隐藏陷阱?

  •  10
  • KM.  · 技术社区  · 15 年前

    我有很多(一千多个)遗产 T-SQL 只会产生 INSERT 进入一个 varchar(8000) 实用工具表中的列。我们的需求已经改变了,现在这个列需要能够处理更大的值。因此,我需要把那列 varchar(max) . 这只是一个普通的数据列,其中没有对其进行搜索,没有对其进行索引,只有一个过程读取它,它是 插入 忘记应用程序(几乎像日志条目)。

    我计划只在几个地方进行更改,这些地方将实际生成较大的数据,并在处理此列的单个存储过程中进行更改。

    • 是否有隐藏的陷阱将列从 VARCHAR(8000) 到A VARCHAR(MAX) ?
    • 将所有 T-SQL 字符串函数的工作原理相同, LEN() , RTRIM() , SUBSTRING() 等。
    • 任何人都能想象我为什么要对代码进行任何认为列仍然存在的更改吗? VARCHAR(8000) ?
    3 回复  |  直到 10 年前
        1
  •  6
  •   Dennis Williamson    15 年前
    • 所有max类型的性能损失都很小,请参见 Performance comparison of varchar(max) vs. varchar(N) .
    • 如果您的维护包括联机操作(联机索引重建),您将失去执行这些操作的可能性。 Online operations are not supported for tables with BLOB columns :
      • 必须创建、重新生成或删除聚集索引 脱机 当基础表包含大型对象(LOB)数据类型时:image、ntext、text、varchar(max)、nvarchar(max)、varbinary(max)和xml。
      • 当表包含LOB数据类型时,可以联机创建非唯一非聚集索引,但索引定义中没有将这些列用作键或非键(包括)列。必须脱机创建或重新生成使用LOB数据类型列定义的非聚集索引。

    性能惩罚是 真正地 很小,所以我不担心。在线重建能力的丧失可能是个问题,因为真正热门的必须是在线操作表。除非网上操作是必须的,否则我会投赞成票,把它改为max。

        2
  •  3
  •   codeulike    14 年前

    Crystal Reports 12(和其他版本,据我所知)无法正确处理varchar(max),并将其解释为varchar(255),这会导致报告中的数据被截断。

    所以,如果您使用Crystal Reports,这对varchar(max)是不利的。或者说是使用晶体的缺点。

    见:
    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

        3
  •  2
  •   KM.    15 年前

    如果您真的不需要索引,而且它是一个大的列,那么您应该很好。varchar(max)似乎正是您所需要的,与使用文本相比,现有代码的问题更少。

    确保测试将文本添加到现有文本的任何更新。它应该可以使用常规的串联,但我希望能够证明它。