首页 > 解决方案 > 为什么可以将 exec 的结果转储到表中,但不能将这些相同的结果用作子查询?

问题描述

所以我有这个查询来处理我的 SQL Server 和链接的 Oracle 服务器之间的问题。目前没有更好的解决方案,这个解决方案快速高效,但我只是不喜欢我必须创建一个临时表的事实。我觉得结果exec()应该能够用作子查询,但它不能。

我的问题是为什么?如果我运行,exec(@OPENQUERYFULL)我会返回所有预期的数据。

同时我也可以INSERT #myTemp exec (@OPENQUERYFULL)将相同的数据加载到临时表中。(也可以对烫发表执行此操作)。

那么为什么我不能简单地做这样的事情:

SELECT LT.U_ID
      ,LT.B_ID
      ,LT.T_NBR
      ,TMP.C_NBR
      ,TMP.A_ID
      ,TMP.L_NBR
FROM LOCAL_TABLE LT
LEFT OUTER JOIN exec(@OPENQUERYFULL) TMP
    ON LT.C_NBR = TMP.C_NBR

带有临时表的原始工作解决方案:

DECLARE @OPENQUERYINTRO nvarchar(4000)
DECLARE @OPENQUERYBODY nvarchar(4000)
DECLARE @SQLSERVERBODY nvarchar(4000)
DECLARE @OPENQUERYFULL nvarchar(4000)

SET @OPENQUERYINTRO = 'SELECT * FROM OPENQUERY(LINKED_SERVER,'''
SET @OPENQUERYBODY = 'SELECT C_NBR, A_ID, L_NBR FROM TABLE_NAME WHERE C_NBR IN ('
SET @SQLSERVERBODY = (
SELECT RTRIM(LTRIM(STUFF((
    SELECT distinct ',' + STR([C_NBR])
        FROM LOCAL_TABLE FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,''))))
SET @OPENQUERYFULL = @OPENQUERYINTRO + @OPENQUERYBODY + @SQLSERVERBODY + ')'')'


IF OBJECT_ID('tempdb..#myTemp', 'U') IS NOT NULL
    DROP TABLE #myTemp;

CREATE TABLE #myTemp(C_NBR varchar(10), A_ID varchar(20), L_NBR varchar(20));

INSERT #myTemp exec (@OPENQUERYFULL);

SELECT LT.U_ID
      ,LT.B_ID
      ,LT.T_NBR
      ,TMP.C_NBR
      ,TMP.A_ID
      ,TMP.L_NBR
FROM #myTemp TMP
LEFT OUTER JOIN LOCAL_TABLE LT
    ON LT.C_NBR = TMP.C_NBR

标签: sqlsql-serverexec

解决方案


我明白这个问题。这就是我将其固定在我身边的方式:我将 openquery 包装在一个视图中:

CREATE VIEW [schema].[v_view]
AS
        SELECT * FROM openquery([LinkedServer], '
        SELECT  *
        FROM    [Server].[schema].[Object]  
        ');

他们我能做到

Select * From [schema].[v_view]

以及我想要的所有连接

希望能帮助到你


推荐阅读