【问题标题】:Text column not storing more than 8000 characters文本列不存储超过 8000 个字符
【发布时间】:2014-07-25 08:32:50
【问题描述】:

我对此进行了研究,发现 SQL Server 中的 text 列可以存储超过 8000 个字符。但是当我在文本列中运行以下插入时,它只插入了 8000 个字符:

UPDATE  a
SET [File] = b.Header + CHAR(13) + CHAR(10) + d.Detail + c.Trailer + CHAR(13) + CHAR(10) + CHAR(26)
FROM Summary a
JOIN #Header b ON b.SummaryId = a.SummaryId
JOIN #Trailer c ON c.SummaryId = a.SummaryId
JOIN #Detail d ON d.SummaryId = a.SummaryId
WHERE   
    a.SummaryId = @SummaryId

我正在尝试生成一个固定宽度的平面文件,每行的长度应为 3900 个字符,并且它们位于相应的临时表中。但是当我在永久表中插入时,预告数据被截断。

我正在添加 char(10) + char(13) 以添加回车和换行以及 char(26) 作为文件结尾,看起来他们正在向固定宽度布局添加字符。

【问题讨论】:

  • ntexttextimage 数据类型将在 SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用nvarchar(max)varchar(max)varbinary(max)See details here
  • @marc_s 你的回答也是正确的,我的初始测试没有达到 8000 个字符的限制,在我的回答中添加了解释。

标签: sql sql-server-2008 flat-file


【解决方案1】:

根据http://msdn.microsoft.com/en-us/library/ms187993.aspx TEXT 字段已弃用。请改用 VARCHAR(MAX) 字段。它们应该支持 2GB 的文本。

【讨论】:

    【解决方案2】:

    你的代码的问题不是你存储值的字段的数据类型,而是你放在一起存储的值的类型。

    b.Header 的类型不是text 而是varchar,它被用作整个表达式的类型。当字符串连接时,结果将被截断以适合varchar 值。

    如果将第一个字符串转换为text,则整个表达式都会获得该类型,并且可以变得超过 8000 个字符:

    SET [File] = cast(b.Header as text) + CHAR(13) + CHAR(10) + d.Detail + c.Trailer + CHAR(13) + CHAR(10) + CHAR(26)
    

    当然,您应该转而使用新类型 varchar(max) 而不是 text,但这不是您的问题的原因。

    【讨论】:

    • 谢谢!这解释了它(以及 Goat CO 的答案)。
    【解决方案3】:

    您的源字段不是 VARCHAR(MAX),因此将它们连接在一起时有 8000 个字符的限制,您可以通过将连接列表中的第一个源字段转换为 VARCHAR(MAX) 来解决此问题:

    UPDATE  a
    SET [File] = CAST(b.Header AS VARCHAR(MAX)) + CHAR(13) + CHAR(10) + d.Detail + c.Trailer + CHAR(13) + CHAR(10) + CHAR(26)
    FROM Summary a
    JOIN #Header b ON b.SummaryId = a.SummaryId
    JOIN #Trailer c ON c.SummaryId = a.SummaryId
    JOIN #Detail d ON d.SummaryId = a.SummaryId
    WHERE a.SummaryId = @SummaryId
    

    如果将一千个 VARCHAR(25) 字段连接在一起,则结果字符串的长度将为 8000,因为这是 VARCHAR() 类型在提供数字长度时的限制。 VARCHAR(MAX) 不共享此限制,但 concat 列表继承了提供的第一个字符串的类型。这是一个有趣的行为,但它就是这样工作的。

    【讨论】:

      【解决方案4】:

      TEXT 已弃用 - 不要使用它!请改用VARCHAR(MAX)

      我认为您需要将在 UPDATE 语句中使用的所有列显式转换为 VARCHAR(MAX) 才能使其正常工作:

      UPDATE  a
      SET [File] = CAST(b.Header AS VARCHAR(MAX)) + CHAR(13) + CHAR(10) + 
                   CAST(d.Detail AS VARCHAR(MAX)) + CAST(c.Trailer AS VARCHAR(MAX))) + CHAR(13) + CHAR(10) + CHAR(26)
      FROM Summary a
      JOIN #Header b ON b.SummaryId = a.SummaryId
      JOIN #Trailer c ON c.SummaryId = a.SummaryId
      JOIN #Detail d ON d.SummaryId = a.SummaryId
      WHERE   
          a.SummaryId = @SummaryId
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-23
        • 1970-01-01
        • 1970-01-01
        • 2011-12-07
        • 2013-12-01
        • 2011-01-22
        • 1970-01-01
        相关资源
        最近更新 更多