C++ SQL Server和Oracle中具有相同未修改查询的Concat字符串

C++ SQL Server和Oracle中具有相同未修改查询的Concat字符串,c++,sql-server,oracle,qt,C++,Sql Server,Oracle,Qt,我有一个程序,必须支持Oracle和SQL Server的数据库。 在某个时刻,我必须执行一个查询,其中我希望在select语句中连接两列 在SQL Server中,这是通过+运算符完成的 select column1 + ' - ' + column2 from mytable 甲骨文这是用concat完成的 select concat(concat(column1, ' - '), column2) from mytable 我正在寻找一种方法来利用这两个数据库,因此我的代码对这两个数据

我有一个程序,必须支持Oracle和SQL Server的数据库。 在某个时刻,我必须执行一个查询,其中我希望在select语句中连接两列

在SQL Server中,这是通过+运算符完成的

select column1 + ' - ' + column2 from mytable
甲骨文这是用concat完成的

select concat(concat(column1, ' - '), column2) from mytable
我正在寻找一种方法来利用这两个数据库,因此我的代码对这两个数据库都有一个SQL查询文本字符串,并且我可以避免在需要检查连接到哪个DBMS的地方出现难看的构造

我的第一反应是将不同的查询封装到一个存储过程中,这样每个DBMS都可以有自己的查询实现,但我无法在Oracle中创建以与SQL Server相同的方式返回记录集的过程

更新:在SQL Server中创建concat函数不会使查询与Oracle兼容,因为SQL Server要求在调用函数时指定所有者为:

select dbo.concat(dbo.concat(column1), ' - '), column2) from mytable
在SQL Server中创建了自己的concat函数之后,我花了一段时间才弄明白

另一方面,看起来像Oracle中带有
SYS\u REFCURSOR
的函数,不能用简单的

exec myfunction
并返回SQL Server中的表


最后,解决方案是在两个RDBMs上创建一个名称相同但实现不同的视图,然后我可以在视图上执行一个简单的
select

如果您想继续创建存储过程,无论您使用什么框架,都应该能够或多或少透明地处理带有
OUT
参数的Oracle存储过程,该参数是
SYS\u REFCURSOR
,并将其调用为只执行
SELECT
语句的SQL Server存储过程

CREATE OR REPLACE PROCEDURE some_procedure( p_rc OUT sys_refcursor )
AS
BEGIN
  -- You could use the CONCAT function rather than Oracle's string concatenation
  -- operator || but I would prefer the double pipes.
  OPEN p_rc
   FOR SELECT column1 || ' - ' || column2
         FROM myTable;
END;

或者,您可以在SQL Server中定义自己的
CONCAT
函数。

如果要继续创建存储过程,无论您使用什么框架,都应该能够或多或少透明地处理带有
OUT
参数的Oracle存储过程,该参数是
SYS\u REFCURSOR
,并将其调用为只执行
SELECT
语句的SQL Server存储过程

CREATE OR REPLACE PROCEDURE some_procedure( p_rc OUT sys_refcursor )
AS
BEGIN
  -- You could use the CONCAT function rather than Oracle's string concatenation
  -- operator || but I would prefer the double pipes.
  OPEN p_rc
   FOR SELECT column1 || ' - ' || column2
         FROM myTable;
END;
或者,您可以在SQL Server中定义自己的
CONCAT
函数。

不,对不起

正如您所注意到的,字符串连接是在SQL Server中通过
+
和Oracle中通过
concat
|
实现的

我将避免在存储过程中进行一些讨厌的字符串操作,而只需在一个或另一个使用相同语法的实例中创建您自己的连接函数。可能是SQL Server,因此您可以使用
concat

另一种选择是通过
+
|
,具体取决于您连接到的RDBMS。

不,对不起

正如您所注意到的,字符串连接是在SQL Server中通过
+
和Oracle中通过
concat
|
实现的

我将避免在存储过程中进行一些讨厌的字符串操作,而只需在一个或另一个使用相同语法的实例中创建您自己的连接函数。可能是SQL Server,因此您可以使用
concat


另一种方法是根据您连接到的RDBMS传递
+
|

显然,在SQL Server 2012中,它们包含了一个CONCAT()函数:


显然,在SQL Server 2012中,它们包含了一个CONCAT()函数:


如果您试图创建一个与数据库无关的应用程序,您应该坚持以下两种方法之一

  • 坚持使用非常基本的SQL,并在应用程序中执行类似的操作

  • 为不同的数据库创建不同的抽象。如果您希望从应用程序中获得任何类型的扩展,那么您可能需要走这条路

    我不想讨论存储过程,您可能可以让它工作,但本周您将发现您需要支持“database X”,然后您还需要重写该数据库中的存储过程。这是疼痛的处方


  • 如果您试图创建一个与数据库无关的应用程序,那么您应该坚持以下两种方法之一

  • 坚持使用非常基本的SQL,并在应用程序中执行类似的操作

  • 为不同的数据库创建不同的抽象。如果您希望从应用程序中获得任何类型的扩展,那么您可能需要走这条路

    我不想讨论存储过程,您可能可以让它工作,但本周您将发现您需要支持“database X”,然后您还需要重写该数据库中的存储过程。这是疼痛的处方


  • 我尝试了这两种方法,但都不允许在编译代码中保留相同的常量文本SQL字符串。最后,我找到的解决方案是创建一个视图。我尝试了这两种方法,但都不允许我在编译的代码中保留相同的常量文本SQL字符串。最后,我找到的解决方案是创建一个视图。