【问题标题】:SQL does not read more than 65536 characters from a text columnSQL 不会从文本列中读取超过 65536 个字符
【发布时间】:2012-07-10 05:19:08
【问题描述】:

我在一个包含其他空间类型的表中有一个文本字段。作为 SSIS 包的一部分,我使用此文本字段在同一个表上运行更新(作为 SQL 任务)并更新几何和地理列。我昨天能够成功运行以下查询

UPDATE Location 
SET [Geometry] = geometry::STGeomFromText(ShapeText, 4326).MakeValid()
FROM Location 
WHERE ShapeText IS NOT NULL

但是,今天它一直在抛出以下异常:

消息 6522,级别 16,状态 1,行 10 发生 .NET Framework 错误 在执行用户定义的例程或聚合“几何”期间: System.FormatException:24141:位置 65536 处应有一个数字 输入。

当我查看形状时,它绝对是一个有效的形状。所以问题不在于形状,而在于 SQL 最多只能从列中读取 65536 个字符。并且当 shapetext 少于 65536 个字符时有效。

如果有人能帮我解决这个问题并让我知道如何从文本字段中读取超过 65536 个字符,那就太好了。

【问题讨论】:

  • @RayToal:谢谢,但我仍然看到同样的异常
  • 无法将形状文本存储为 varchar 或 nvarchar?它实际上是文本类型吗?
  • 这是一种文本类型,我很快将其更改为 varchar(max) 以对其进行测试并再次运行查询,仍然是相同的异常。
  • 我使用过超过 64k 的 varchar(max) 值。 SQL Server 本身没有问题。我怀疑问题是 StGeomFromText 和 MakeValid 之间的交互。

标签: sql ssis sql-server-2008-r2


【解决方案1】:

所以,我终于找到了问题和解决方案。尽管这个问题看起来有点过于离散,但我希望它可以帮助其他人。

问题:我开始搜索这个 65536 字符的错误消息,它引导我找到提到 SQL 内存问题的博客。然后我检查了我的 SQL 日志,它确实报告了错误消息:

未能保留 Size= 65536 的连续内存

令人困惑的是,它在一天工作,然后第二天,它开始向我抛出错误消息,所以我肯定在某个地方进行了内存消耗操作。经过仔细检查,我发现我的 SSIS 包中有一个派生列,它是所有内存问题的根源。派生列正在检查文本字段的长度,如果长度为零,则将其设置为 null。

解决方案:我删除了派生列操作并将其替换为 SQL 任务,它再次运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 2017-09-19
    • 2018-08-06
    • 2019-02-08
    相关资源
    最近更新 更多