【问题标题】:Can PostgreSQL perform a join between two SQL Server stored procedures?PostgreSQL 可以在两个 SQL Server 存储过程之间执行连接吗?
【发布时间】:2016-02-27 00:37:47
【问题描述】:

这个问题与之前的一个问题有关:Why is selecting from stored procedure not supported in relational databases?

在 SQL Server 上,您不能执行连接(或从中选择)存储过程(请注意:存储过程与函数(表SQL Server 术语中的值函数)- 使用函数,您知道在设计时返回的列,但使用过程,要返回的特定列直到运行时才知道)。

对于 SQL Server,确实存在一种“DBA 通常不允许”的方法,可以在其中完成这样的连接:OPENROWSET

所以问题是:

  1. PostgreSQL 能否在两个过程之间执行连接,其中列直到运行时才知道?

  2. 除了使用驻留在外部 3rd 方数据库中的存储过程(可能通过外部数据包装器或其他机制)之外,它是否可以这样做?

【问题讨论】:

  • 为什么用 Oracle 标记?
  • 你想做什么,为什么要加入存储过程?如果你不会写函数或视图,那很有可能是你做错了什么
  • DBA 和高级开发人员讨厌OPENROWSET,因为这意味着无法进行优化或索引,并且所有数据都必须在类似游标(即慢速)循环中处理。
  • “你想做什么” - 很多时候你不是从头开始编写代码,你必须使用第三方编写的 SP 或系统过程(可能应该写成函数但不是。)

标签: sql sql-server database postgresql foreign-data-wrapper


【解决方案1】:
  1. PostgreSQL 能否在两个 ~ 过程之间执行连接,其中 列直到运行时才知道?

基本的答案很简单,因为 Postgres(直到 Postgres 10)中目前没有存储过程,只有函数 - 提供几乎但不完全相同的功能,正如您在问题中所述。

任何函数都可以像任何其他表一样在SELECT 查询的FROM 子句中使用。

更新:
SQL 过程(“存储过程”)是在 Postgres 11 中引入的。
CREATE PROCEDURE的手册。

SQL 本身要求在运行时知道返回类型。有一个border-case:您可以使用polymorphic types 声明函数调用的返回类型。此处有详细说明(与您最相关的最后一章):

  1. 除了使用驻留在 外部 3rd 方数据库(可能通过外部数据包装器或 其他一些机制)?

这也是一个否,基于相同的原则。如果您使用foreign tables,则必须以一种或另一种方式提供明确定义的返回类型。

您可能能够将由 SQL-Server 存储过程产生的整行合并为单个制表符分隔的文本表示,但随后(除了容易出错和效率低下)您有一个列,并且需要定义各个列的元信息以一种或另一种方式来提取列-catch 22。

【讨论】:

  • 即使在 SQL Server 中,如果需要连接,不应该使用存储过程,而是使用视图或函数。 DBA 不喜欢 OPENROWSET 是有原因的——这意味着必须将结果转储到某个地方并在没有索引的情况下进行查询
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
相关资源
最近更新 更多