【问题标题】:Use results of an `exec` query as a join or "in" statement?使用 exec 查询的结果作为 join 或“in”语句?
【发布时间】:2020-01-17 15:39:42
【问题描述】:

由于 SQL Server 和链接的 Oracle 服务器之间的问题迫使我使用 OpenQuery,我在 NVARCHAR 中构建了一个查询。它工作正常,当我运行exec (@OPENQUERYFULL) 时,我得到了我需要的结果。

我的结果是另一个查询所需的单列数字。我希望能够将这些结果用作“IN ()”语句或 JOIN,但到目前为止我尝试的方法都失败了。

有没有办法在另一个查询中直接使用exec 查询的结果?

更新: 需要明确的是,我试图避免使用临时表。

【问题讨论】:

  • 您是否尝试过声明一个表变量并将 oracle 查询的结果存储在其中?一列数字只是一列数字。你能提供一个失败的代码示例吗?
  • 您可以使用链接服务器/ 4 部分名称来编写使用普通 JOIN 的单个查询,但如果您的原始 OPENQUERY 中有很多内容,它可能会非常慢。您可以创建一个临时表(或表变量)来存储 OPENQUERY 的结果,然后在第二个查询中使用它,但现在您有两个查询和潜在的内务处理。
  • @RichardHansell 我知道我可以编写一个临时表并使用它。我希望避免编写临时表,而只是像子查询一样使用它。我无法真正提供示例,因为它是敏感的公司信息,并且需要 30 分钟才能将其清理为帖子。我希望有人知道一种将exec 查询的结果用作子查询或联接的简单方法。

标签: sql sql-server subquery exec


【解决方案1】:

声明一个表变量并将另一个SP的结果插入到该变量中:

declare @results table (
    numbers int
);

GO

insert into @results(numbers)
exec otherSP

然后您对表变量执行联接。

【讨论】:

  • 我想避免这样做。我不想使用临时表。我已经知道如何作为临时工来做到这一点。我真的只是想使用像子查询一样的结果来运行单个查询。
  • @Mike-SMT 我的谷歌搜索表明你不能,除了实际创建一个与你的 oracle 存储过程做同样事情的子查询。从表面上看,这似乎是一个奇怪的要求。
  • @Mike-SMT 也很清楚,表变量不是临时表。它们可能以类似的方式使用。但在后台,它们实际上是完全不同的,具有不同的性能特征。
  • 这不是真正的要求。我有大约 50 个查询要转换,我正在减少它们,因为这些旧查询效率不高。为了减少发送到服务器的查询数量,我试图尽可能减少。如果我必须在这种情况下使用临时表,那么我会的。我只是希望有一个明确的解决方案,在联接或语句中使用 exec。
  • @Mike-SMT 我手头没有文档,但这是一个比较临时表和表变量之间差异的快速 SO 链接:stackoverflow.com/questions/11857789/… 临时表写入磁盘,而表变量存储在内存中(但可能会被推送到磁盘)
【解决方案2】:

您可以通过使用 OPENQUERY 和连接构建动态查询来发送使用 OPENQUERY 而不是“exec”的链接服务器查询。它只是需要一些烦人的字符串转义,例如:

declare @oracleSQL nvarchar(max) = 'select 1 a, ''hello'' b from dual';

declare @sql nvarchar(max) = concat(
N'
with q as
(
  SELECT * FROM OPENQUERY (OracleSvr, N''', replace(@oracleSQL,'''','''''') ,N''')
)
select *
from q
cross join sys.objects o
')

print @sql 
exec ( @sql )

但是您可以看到生成的代码有点复杂。所以我几乎总是只使用临时表。

【讨论】:

  • 好吧,如果临时表是我对执行结果的唯一选择,那么我将这样做。我试图避免这种情况并使用单个查询。
  • 抱歉,我没有意识到您没有设置临时表。这对我来说是新的,我将不得不看看我是否可以让它发挥作用。我不熟悉N''', replace(@oracleSQL,'''','''''') ,N'''。在我可以做一些研究之前,我还没有以这种方式使用过 OPENQUERY,现在可能有点过头了。
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 2021-01-29
相关资源
最近更新 更多