sql - 为什么可以将 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
解决方案
我明白这个问题。这就是我将其固定在我身边的方式:我将 openquery 包装在一个视图中:
CREATE VIEW [schema].[v_view]
AS
SELECT * FROM openquery([LinkedServer], '
SELECT *
FROM [Server].[schema].[Object]
');
他们我能做到
Select * From [schema].[v_view]
以及我想要的所有连接
希望能帮助到你
推荐阅读
- visual-foxpro - 如何让 Visual FoxPro 表单 (SCT) “忘记”旧的 DBF?
- centreon-api - Centreon中的一组主机汇总状态
- javascript - 如何使用 Javascript 终止无限滚动
- python - 比较每行数据帧的两列
- r - 在数据透视表中使用同一级别的多个字段
- python - 循环遍历嵌套字典值以填充第二个字典 - python
- python - 熊猫数据框中的语法无效
- angular - 如何以角度 6/7/8 将页面加载时间发送到谷歌分析
- android - Android Flutter:我需要在正文中设置“SingleChildScrollView”吗?
- jquery - 在 .detach 之后将选定的选项附加到下拉/选择框 - Laravel,jQuery