Sql server 如何在openquery where子句中使用子查询
因此,我在一个存储过程中使用了这个Openquery,在这个过程中,我需要返回列中的值与本地表中的值相同的结果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
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将返回单独的行。