从OpenQuery结果中过滤记录

时间:2017-02-13 16:48:16

标签: sql tsql sql-server-2014

我正在查询链接服务器:

    DECLARE @result nvarchar(max);
    SET @Sql = N'
    SELECT * 
    FROM OPENQUERY(DATABASE_' + UPPER(@Environment) + ', ''
        Complex Query against the linked server...
    '');'

    EXECUTE sp_executesql @sql, @result OUTPUT

在将结果插入正确的表之前,我必须过滤结果的某些行。我无法在原始查询中过滤它们,因为结果必须与目标表中的值匹配。

类似的东西:

INSERT INTO targetTable 
SELECT * FROM @result AS r
WHERE r.Col1 NOT IN (SELECT Col1 FROM targetTable)
AND   r.Col2 NOT IN (SELECT Col2 FROM targetTable)

我无法使用@results变量进行查询,因为它不是表格。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

创建表变量或临时表。插入openquery中的记录。以下是表变量的示例。

declare @tableVar as table (
field1 varchar(10)
, field2 int
etc
);

declare @sql as nvarchar(max);
set @sql = '
SELECT value1, value2, etc 
FROM OPENQUERY(DATABASE_' + UPPER(@Environment) + ', ''
    Complex Query against the linked server...
'');

insert into @tableVar
EXECUTE sp_executesql @sql
';

答案 1 :(得分:0)

使用提示表单here

解决了我的问题

代码:

DECLARE @linkedServer varchar(50) = 'linkedServerName';
DECLARE @Sql NVARCHAR(MAX);

SET @Sql = N'
INSERT INTO [DatabaseName].[Schema].[Table]
SELECT 
    t1.Column1
FROM OPENQUERY(' + @linkedServer + ', 
''
   complex query here
) AS t1

WHERE t1.Column1 NOT IN (SELECT Column1 FROM [DatabaseName].[Schema].[Table])
;
';

EXECUTE sp_executesql @sql;

像魅力一样。

亲切的问候