生产环境使用SQL Server,集成测试使用H2数据库。我们使用一个数据库视图,该视图连接了许多数据库列,其中一些使用STUFF
函数在视图中创建其字段值。用于生产环境的数据库表是由Flyway脚本创建的,而用于集成测试的表是由Hibernate自动生成的,或者是在测试之前使用@SQL
注释通过SQL脚本创建的。 STUFF
函数不适用于H2方言,因此在运行测试类时无法生成视图。
以前尝试解决问题的方法:
;MODE=MSSQLServer
添加到为测试应用程序配置文件指定的属性中的databaseUrl属性中。ALIAS
定义一个虚拟函数,该函数将充当集成测试的STUFF
函数。这些尝试均无济于事。
问题:如何为H2数据库创建这样的视图?
背景信息:使用此视图以编程方式为Elasticsearch索引重新编制了索引。测试类在连接到视图中的适当表中设置数据,并为Elasticsearch索引测试数据的处理。
答案 0 :(得分:1)
STUFF()
只是更复杂表达的简写。这些产生相同的结果:
DECLARE
@expr varchar(64) = 'hello there',
@start int = 6,
@chars int = 4,
@repl varchar(64) = 'bye';
SELECT STUFF(@expr,@start,@chars,@repl);
SELECT LEFT(@expr,@start-1) + @repl + SUBSTRING(@expr, @start + @chars, 64);
忽略1个字符的字符串和其他极端情况(例如长度超过10亿个字符的字符串)的错误处理,您可以创建一个为您抽象STUFF()
的函数。在SQL Server系统上,该函数是:
CREATE FUNCTION dbo.StuffForMe
(
@expr nvarchar(max),
@start int,
@chars int,
@repl nvarchar(max)
)
RETURNS nvarchar(max)
WITH SCHEMABINDING
AS
BEGIN
RETURN (SELECT STUFF(@expr,@start,@chars,@repl));
END
GO
在H2上:
CREATE FUNCTION dbo.StuffForMe
(
@expr nvarchar(max),
@start int,
@chars int,
@repl nvarchar(max)
)
RETURNS nvarchar(max)
WITH SCHEMABINDING
AS
BEGIN
RETURN (SELECT LEFT(@expr,@start-1) + @repl
+ SUBSTRING(@expr, @start + @chars, 1000000000));
END
GO
您的视图然后仅引用dbo.StuffForMe
,因此不必在系统之间进行更改,您只需要分别部署两个不同版本的功能即可。