- 用友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