Files
WorkNote/SanPinPLM/报错处理/将截断字符串或二进制数据.md

4.1 KiB
Raw Blame History

问题情况

在定义对象分类的 常规属性界面 时,保存失败,提示将截断字符串或二进制数据

image-20241209142950355

尽管没办法保存,但可以先在 常规属性页面 右键选择 保存到磁盘,先将定义好的页面保存下来,待处理完问题后,再通过 从磁盘加载 选项进行恢复

image-20241209171241152

解决方法

打开服务器找到三品PLM服务端的安装位置打开log文件夹,找出对应日期的以sql开头的日志文件

将其打开后,搜索“截断”二字

image-20241209155233906

将这一整行的内容全部复制出来(非常非常多)

image-20241209155424965

复制出来后存储在一个新的txt文本中,新建一个Excel工作表,在 数据 选项卡中选择 从文本/CSV 中获取数据

image-20241209155616711

选择刚刚新建的txt文本,进行导入

image-20241209155723615

分隔符选择 逗号,选择 转换数据

image-20241209155759743

这将会打开Power Query编辑器,根据逗号拆出的所有数据会汇总到一行当中,选择 转换 选项卡,选择 转置 选项,可以将一行的数据转换成一列

image-20241209163530401

再选择 主页拆分列按分隔符 进行拆分

image-20241209163754103

选择分隔符为等号,引号字符为无,点击确定

image-20241209163927118

得到拆分结果后选择 关闭并上载

image-20241209164101903

数据会写入到Excel表中,使用LEN函数统计出第二列中字符串的长度

image-20241209164342971

通过筛选找出所有长度大于255的行,拿第一列的值到新建的txt文本中搜索,确认这是一个属性

表格中的数据只是进行了粗略的处理,不一定正确,需要找到正确的属性才行

image-20241209164748882

objpropnames则是正确的属性

image-20241209165003039

打开服务器上的SSMS,连接plmv8数据库,执行如下sql语句

/* 
if exists(Select * From syscolumns where id=Object_ID('cfobjkind') and Name='columnName'): 这一行是在检查cfobjkind表中是否存在名为columnName的列。syscolumns是一个系统表它包含了数据库中所有对象如表和视图的列信息。Object_ID('cfobjkind')返回cfobjkind对象的ID如果该对象不存在则返回NULL
begin ... end: 如果上述条件为真即存在这样的列那么执行begin和end之间的语句
Alter Table cfobjkind alter column defaultvalue nvarchar(max): 这行命令尝试更改cfobjkind表中columnName列的数据类型为nvarchar(max)。nvarchar(max)表示可变长度的Unicode字符数据最大长度为2^31-1个字符
*/
if exists(Select * From syscolumns where id=Object_ID('cfobjkind') and Name='columnName')
begin
  Alter Table cfobjkind alter column columnName nvarchar(max)
end
Go

==切记执行上述语句前,columnName替换成查找出来的属性==

执行完语句后,再保存常规属性界面时,就不会报错了(再报错说明改的属性不对,需要排查其他属性)

问题原因

报错是因为要存储的值超过了数据库中该字段可存储的值的长度上限

objpropnames 字段为例,这是存储对象分类的常规属性界面中所有的属性名的,在上例中,objpropnames 要存储的值长度为4334而数据库中仅能存储长度为4000的值故而出现了报错只要将这个字段的类型改成nvarchar (max) 即可