2017-02-13 4 views
0

Я запрашивая связанный сервер:Фильтр записи из результата OpenQuery

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 для запроса из, потому что это не таблица.

Как это сделать?

ответ

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; 

работает как шарм.

С уважением

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 
'; 
+0

привет, спасибо за ответ. Вы уверены в «EXECUTE sp_executesql @sql» в переменной @sql? Я вывожу его снаружи, но я получаю «Должен объявить переменную таблицы @tmpTable». если я попытаюсь запросить «SELECT * FROM @tmpTable;». – Mario