我致力于使用多种数据库(Postgresql,Sql Server,Oracle)的报告工具(基于JasperReports)。所有平台都共享一个公共的Jasper域,其中一些域需要公共的脚本化SQL选择查询(例如,从表xxx中选择bla ..)
在一个特定的脚本中,我需要引用在所有平台上创建的用户功能。
问题是,对于脚本,我可以将此函数引用为
select my_func(col1, col2) from some_table
在PostgreSQL和Oracle安装上。但是由于得到了“ my_func不是公认的内置函数名称。 ”错误消息,因此无法像在SQL Server上一样运行相同的查询。
为了使其正常工作,我必须使用dbo.
来限定该功能,即
select dbo.my_func(col1, col2) from some_table
但是,这当然不适用于Oracle和Postgresql。
所以我的问题是,无论如何要在SQL Server上创建此函数以能够调用它而不必用dbo.
部分来限定它。
答案 0 :(得分:3)
我认为SQL Server无法实现。
标量值函数可以在标量表达式为 用过的。这包括计算列和CHECK约束定义。 标量值函数也可以通过使用EXECUTE执行 声明。 标量值函数必须至少使用 函数的两部分名称。有关更多信息 多部分名称,请参见Transact-SQL语法约定(Transact-SQL)。 可以在表表达式所在的位置调用表值函数 SELECT,INSERT,UPDATE或DELETE的FROM子句中允许 陈述。有关更多信息,请参见执行用户定义的函数。
添加了重点
请参阅:
您也许可以省略该模式,而改为引用数据库名称:
[database]..[object]
答案 1 :(得分:1)
正如Michael G上面提到的,您应该在SQL Server上指定dbo
。所以问题是对多DBMS的支持。在编程级别有几种解决方案,例如预处理SQL代码。
您还可以将函数封装在视图中,并在Oracle和PostgreSQL上使用
SQL Server
CREATE VIEW my_func_view AS SELECT dbo.my_func(col1, col2) AS col12 FROM some_table
Oracle
CREATE VIEW my_func_view AS SELECT my_func(col1, col2) AS col12 FROM some_table
在代码中
SELECT * FROM my_func_view