guliaoyong 2019-05-28 14:42 采纳率: 50%
浏览 233

同一个存储过程,在不同数据库(环境相似)中执行时报错

  • 用友U8 ERP的账套,通过导出,引入后,生成了一个新的账套数据库。
  • 在新账套中有些原本执行成功的存储过程报错了。
  • 我在数据库中,做了一个把字符串通过分隔符,分解成表的表值函数。
  • 内容如下:
GO
/****** Object:  UserDefinedFunction [dbo].[func_splitid]    Script Date: 05/28/2019 14:21:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER function [dbo].[func_splitid]
(@str varchar(max),@split varchar(10)) 
RETURNS @t Table (c1 nvarchar(100)) 
AS
BEGIN
DECLARE @x XML 
SET @x = CONVERT(XML,'<items><item id="' + REPLACE(@str, @split, '"/><item id="') + '"/></items>') 
INSERT INTO @t SELECT x.item.value('@id[1]', 'nvarchar(100)') FROM @x.nodes('//items/item') AS x(item) 
RETURN
END
  • 然后在其他存储过程中调用时,在原来的账套中可以正常执行,在新账套中报错。
  • 代码示例:
select * from [dbo].func_splitid((case when 1=1 then '1' else '2' end),'')
  • 在原始账套中可以正常执行,在新账套中,报'(' 附近有语法错误。
  • 如果不使用case判断及括号的情况下,函数是可以正常运行的。只有使用case判断的时候报错。

问题找到了,比较了两个数据库的设置,原来是compatibility_level 这个参数不同,大概是兼容性等级。
旧数据库是100,新数据是80,执行下面的操作,新数据库也没问题了

alter database basename
set compatibility_level=100
  • 写回答

1条回答 默认 最新

  • 憧憬blog 2023-03-15 07:15
    关注

    你遇到的问题很可能与不同的兼容性等级有关。在你的新账套中,数据库的兼容性等级可能低于原始账套中的等级,导致在新账套中执行时报错。你可以通过将新账套的兼容性等级设置为与原始账套相同来解决这个问题。你可以使用以下命令更改数据库的兼容性等级:

    alter database databasename set compatibility_level = 100
    

    其中databasename是你要更改兼容性等级的数据库的名称,100是你要设置的兼容性等级。

    评论

报告相同问题?

悬赏问题

  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler