现场无法重建TVP解决办法

by zhaoff 2015.6.16 09:30

注:脚本执行有风险,对于客户正式环境请在研发指导下执行。

9201505290064:打了SP1补丁后,凭证无法保存、以前凭证无法审核,问题见附件

已做了运行数据库中的exec p_createcustomtype_wrap 1,问题没有解决。

报错如下:

 

搜索相关Blog,得到如下解决方式: 

 

如何处理TVP表列与数据库表列不相同的情况

by 吕洪雨 2011.9.5 21:01

当遇到这种问题的时候要区分两种情况进行处理

错误信息:“正在尝试传递具有 XX 列的表值参数,其中对应的用户定义表类型需要 YY 列”

1、报TVP的列比数据库的列多(XX>YY)

这种情况比较简单,调用p_CreateCustomType '表名' 重建TVP即可,如果想要重建数据库所有表的TVP请调用p_CreateCustomType_Wrapper ' 0(如果已存在tvp类型不重建),1 (即使已经存在也强制重建)'

2、报数据库表的列比TVP的列多(XX<YY)

这种情况相对比较复杂,往往是因为在元数据中删除了字段造成的,因为升级的时候不会删除数据库中的字段,由此造成了TVP比数据库表少列的情况,这时需要进行排查(可通过各种文档比较工具查看)删除了哪个字段,在确认该字段无用的情况下写个脚本删之,即可

  --qihw 补充: 注,检查的时候,可以通过Sys.Columns UBF_MD_Attribute 来进行比对,比对可以用 子查询, 但注意,一定要排除

IsGloabl 多语  IsCollection 集合 的情况。

 

 

现场属于第一种情况,应该执行exec p_createcustomtype_wrapper  1,就能解决,结果重复执行了多次都没效果。

 

把本地CreateTVP的脚本发往现场,执行,凭证就能正常保存了,说明问题出在p_createcustomtype_wrapper里。

查看存储过程发现:

存储过程p_CreateCustomTypep_CreateCustomType_Wrapper均有对数据库版本的判断。

    declare @ProductVersion varchar(100)

    declare @EngineEdition int

    --获取SqlServer版本号

    set @ProductVersion=cast(SERVERPROPERTY('ProductVersion') as varchar(100))

    set @EngineEdition=cast(SERVERPROPERTY('EngineEdition') as int)

    --对版本号进行比较以判断是否是SqlServer2008及以上版本

    if cast(SUBSTRING(@ProductVersion,1,CHARINDEX('.',@ProductVersion,1)-1) as int)<'10' or @EngineEdition<>3

    return

 

现场ProductVersion11.0.2100.60

EngineEdition2

 

导致TVP无法重建,现场版本是Sql2012标准版。

 

EngineEdition=3表示为企业版:

 

 

张红斌如下解释:这个限制对于TVP而言,是没有意义的,应该是标准版都支持。存储过程中检查ProductVersion是对的,检查EngineEdition就属于画蛇添足了.

所以最后该问题由平台出补丁,去掉EngineEdition的校验。

Tags:

F财务

添加评论



biuquote
微笑得意调皮害羞酷大笑惊讶发呆喜欢可怜尴尬闭嘴噘嘴皱眉伤心抓狂呕吐坏笑漫骂发怒
Loading


RecentComments

评论 RSS

Statistics

989 篇文章
0 个单页
694650 条评论
11 次评分
409329 次访问
访问统计开始于 2019年12月15日
平均日访问 6201 次
当前 94 人在线