SQL从文本列读取的字符数不超过65536个
我在表中有一个文本字段和其他空间类型。作为SSIS包的一部分,我使用此文本字段在同一个表上运行更新(作为SQL任务),并更新几何体和地理列。昨天我成功地运行了以下查询SQL从文本列读取的字符数不超过65536个,sql,ssis,sql-server-2008-r2,Sql,Ssis,Sql Server 2008 R2,我在表中有一个文本字段和其他空间类型。作为SSIS包的一部分,我使用此文本字段在同一个表上运行更新(作为SQL任务),并更新几何体和地理列。昨天我成功地运行了以下查询 UPDATE Location SET [Geometry] = geometry::STGeomFromText(ShapeText, 4326).MakeValid() FROM Location WHERE ShapeText IS NOT NULL 但是,今天它抛出了以下例外: Msg 6522,级别16,状态1,第
UPDATE Location
SET [Geometry] = geometry::STGeomFromText(ShapeText, 4326).MakeValid()
FROM Location
WHERE ShapeText IS NOT NULL
但是,今天它抛出了以下例外:
Msg 6522,级别16,状态1,第10行发生.NET Framework错误
在执行用户定义的例程或聚合“几何体”期间:
System.FormatException:24141:位置65536处应为一个数字
输入的一部分
当我看这个形状时,它绝对是一个有效的形状。因此,问题不在于形状,而在于SQL从列中最多只能读取65536个字符。当shapetext少于65536个字符时,它就可以工作
如果有人能帮我解决这个问题,让我知道如何从文本字段中读取65536个以上的字符,那就太好了。因此,我终于找到了问题和解决方案。尽管这个问题看起来有点过于离散,但我希望它能帮助其他人 问题:我开始搜索这个65536个字符的错误消息,它让我找到了提到SQL内存问题的博客。然后我检查了我的SQL日志,它确实有错误消息报告: 未能保留大小为65536的连续内存 令人困惑的是,它前一天还在工作,然后第二天,它开始向我抛出错误消息,所以我肯定在某处进行了一次消耗记忆的操作。仔细检查后,我发现我的SSIS包中有一个派生列,它是所有内存问题的根源。派生列正在检查文本字段的长度,如果长度为零,则将其设置为null
解决方案:我删除了派生列操作,取而代之的是一个SQL任务,它再次运行得很好。请参阅@RayToal:谢谢,但我仍然看到相同的例外情况无法将形状文本存储为varchar或nvarchar?它实际上是文本类型吗?它是一种文本类型,我很快将它更改为varchar(max)来测试它,并再次运行查询,但仍然是相同的异常。我使用的varchar(max)值超过64k。SQL Server本身没有问题。我怀疑问题在于StGeomFromText和MakeValid之间的交互。