Sql server 如何在openquery where子句中使用子查询

Sql server 如何在openquery where子句中使用子查询,sql-server,Sql Server,因此,我在一个存储过程中使用了这个Openquery,在这个过程中,我需要返回列中的值与本地表中的值相同的结果 exec spx_SELECT_LocalizacoesEtiquetas GO IF OBJECT_ID('dbo.spx_SELECT_LocalizacoesEtiquetas') IS NOT NULL DROP PROCEDURE spx_SELECT_LocalizacoesEtiquetas GO CREATE PROCEDURE spx_SELECT_Locali

因此,我在一个存储过程中使用了这个Openquery,在这个过程中,我需要返回列中的值与本地表中的值相同的结果

exec spx_SELECT_LocalizacoesEtiquetas 


GO
IF OBJECT_ID('dbo.spx_SELECT_LocalizacoesEtiquetas') IS NOT NULL
DROP PROCEDURE spx_SELECT_LocalizacoesEtiquetas
GO
CREATE PROCEDURE spx_SELECT_LocalizacoesEtiquetas   

AS
BEGIN
SET NOCOUNT ON 

DECLARE @SQL NVARCHAR(MAX); 
    SET @SQL = 

'SELECT ET0109 AS Localizacao, Etiquetas
FROM OpenQuery(MACPAC, ''SELECT FET001.ET0109,  FET001.ET0101 AS Etiquetas
FROM AUTO.D805DATPOR.FET001 FET001
WHERE FET001.ET0104=''''POE'''' AND FET001.ET0105=''''DIS'''''' AND FET001.ET0101 = ''''' 
+ (SELECT Localizacao FROM xLocalizacao WHERE InventarioID = 1 ) +  ''''' ) ';

EXEC sp_executesql @SQL

END
基本上它不会接受子查询,因为它说它有太多的值。。。。所以我的问题是。如果列的值与本地表中的值匹配,如何限制子查询中的值?基本上是a,其中开放查询中的a列=本地表中的B列

exec spx_SELECT_LocalizacoesEtiquetas 


GO
IF OBJECT_ID('dbo.spx_SELECT_LocalizacoesEtiquetas') IS NOT NULL
DROP PROCEDURE spx_SELECT_LocalizacoesEtiquetas
GO
CREATE PROCEDURE spx_SELECT_LocalizacoesEtiquetas   

AS
BEGIN
SET NOCOUNT ON 

DECLARE @SQL NVARCHAR(MAX); 
    SET @SQL = 

'SELECT ET0109 AS Localizacao, Etiquetas
FROM OpenQuery(MACPAC, ''SELECT FET001.ET0109,  FET001.ET0101 AS Etiquetas
FROM AUTO.D805DATPOR.FET001 FET001
WHERE FET001.ET0104=''''POE'''' AND FET001.ET0105=''''DIS'''''' AND FET001.ET0101 = ''''' 
+ (SELECT Localizacao FROM xLocalizacao WHERE InventarioID = 1 ) +  ''''' ) ';

EXEC sp_executesql @SQL

END
编辑。

这就是我想要实现的目标

SubQuery returns from Local table


 Column A
|   A   |
|   B   |
|   C   |
|   D   |
|   E   |

Open query returns

   Column A  Column B
  |   A   |    0   |
  |   A   |    0   |
  |   A1  |    1   |
  |   A   |    2   |
  |   B   |    3   |
  |   B   |    3   |
  |   B1  |    4   |


Final result should Be


    Final query
   Column A    Column B
  |   A   |    0   |
  |   A   |    0   |
  |   A   |    2   |
  |   B   |    3   |
  |   B   |    3   |

好的,在你的方法中需要做两个改变

首先,将子查询连接到字符串。不管怎样,子查询都必须返回单个值,而不是多行集。因此,需要使用您选择的方法让查询返回逗号分隔的字符串

换句话说,与此相反:

 Column A
|   A   |
|   B   |
|   C   |
|   D   |
|   E   |
AND FET001.ET0101 = ''''' 
+ (Your Subquery) +  ''''' ) '
子查询需要返回包含以下内容的单个varchar列:

'A','B','C','D','E'
您需要做的下一个更改是使用IN而不是=

因此,与此相反:

 Column A
|   A   |
|   B   |
|   C   |
|   D   |
|   E   |
AND FET001.ET0101 = ''''' 
+ (Your Subquery) +  ''''' ) '
你需要这个:

AND FET001.ET0101 IN ( ' 
+ (Your Subquery) +  ') ) '

子查询是否返回多行?是的,我需要openquery中列的值与子查询相同,我不确定是否有更好的方法。Subquery从一列返回x个值,我需要从openquery中获取一列,它们与Subquery匹配。单个列每行只能包含一个值,所以您希望通过基本上说
where ColumnX={more-one value}
来实现什么呢?如果ColumnX=“a”,它也不能=“b”。我想你可能需要用一个数据示例和期望的结果来解释这一点。目前还不清楚您要做什么。请参阅更新的帖子,我展示了我真正想要做的事情。我需要将子查询中的行合并为1,但它是否返回所有与其他openquery值分开的行?是的,您的主openquery将返回单独的行。