没有[dbo]的用户标量值函数。部分

时间:2018-10-23 15:50:26

标签: sql-server

我致力于使用多种数据库(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.部分来限定它。

2 个答案:

答案 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