SQL 在 SQL Server 和 Oracle 中返回固定数据

Posted

技术标签:

【中文标题】SQL 在 SQL Server 和 Oracle 中返回固定数据【英文标题】:SQL to return fixed data in both SQL Server and Oracle 【发布时间】:2011-09-13 11:25:38 【问题描述】:

我需要一个通用的选择语句,它返回一个固定的值/行而不需要表,它必须与 Oracle 和 Sql Server 一起使用。

例如对于 Oracle,我知道我可以使用:

select 'O' AS INDICATOR from DUAL;

但这在 Sql Server 上不起作用。

这可以在 Oracle 和 SQL Server 上使用相同的 SQL 完成吗?

【问题讨论】:

您是否正在编写适用于两种数据库的数据层? 好久没用oracle了,select * from (select 'O' as Indicator) T @Alex - Orable 的选择需要存在 from 子句。 @Raj More 不,我正在使用现有的应用程序(JasperServer),我需要创建他们所谓的“派生表”,它只返回这个。不幸的是,SQL 存储在存储库中并且是固定的,因此无法抽象出来。 【参考方案1】:

AFAIK,您将需要不同的查询,除非您可以找到同时存在于 SQL Server 和 Oracle Server 上的表。

Oracle 使用DUAL 表进行虚拟查询,而在 SQL 服务器上仅选择常量的语法更简单:

select 'O' as Indicator

将返回单行记录集。

附:如果您打算只编写标准 SQL 并让它同时在 SQL Server 和 Oracle 上运行,请注意存在很多差异,即使您不使用数据库端代码(存储过程和函数)。

在我的脑海中,有些事情是不同的:

Case 语句语法 NVL 与 IsNull 空排序行为 数据转换函数 字符串操作函数 等等等等

【讨论】:

数据库中的表是相同的,所以是的,我可以使用这个建议,例如:select distinct 'O' as INDICATOR from SOME_COMMON_TABLE; @Neil,从 SOME_COMMON_TABLE 中选择的缺点是您可能正在对该表执行 IO。如果您能够对 SQL Server 和 Oracle 分别使用适当形式的两个不同查询,则可以避免 IO。 (鉴于 Oracle 版本足够晚,支持“快速双”)【参考方案2】:

如果没有 from 语句,您将无法在 Oracle 中选择数据。所以您需要在 Oracle 中有一个表(通常的做法是使用标准表 - Dual)。如果您真的需要在两个数据库服务器上运行相同的查询,最好的解决方案是在 MS SQL 中创建只有一行的 Dual 表。但实际上最好对不同的服务器使用不同的查询(也许通过一些抽象层)。

【讨论】:

是的,这会起作用,但我正试图摆脱创建伪表【参考方案3】:

使用common table expression (CTE) 例如

WITH D (INDICATOR)
     AS 
     (
      SELECT * 
        FROM (
              VALUES ('O')
             ) T (c1)
     )
SELECT INDICATOR 
  FROM D;

或者更简单的排队:

SELECT *
 FROM (
       VALUES ('O')
      ) D (INDICATOR)

【讨论】:

【参考方案4】:

您可以在 SQL Server 中创建 DUAL 表:

CREATE TABLE DUAL (DUMMY NVARCHAR(1) NOT NULL);

INSERT INTO DUAL VALUES ('X');

然后使用与 Oracle 中相同的查询:

select 'O' AS INDICATOR from DUAL;

【讨论】:

同上。是的,这会工作,但我试图摆脱创建伪表

以上是关于SQL 在 SQL Server 和 Oracle 中返回固定数据的主要内容,如果未能解决你的问题,请参考以下文章

sql server 2008 链接 ORACLE 问题

sql SQL Server和Oracle SQL的SQL语法的一些示例

SSIS 执行 SQL 任务,受 MERGE 语句影响的行(Oracle 和 SQL Server)

sql server的sql语句和oracle的sql语句有啥不同吗?

oracle里面有没有类似与sql server里面的go?

PHP可以和sql server/oracle等数据库连接吗