2016-02-24 3 views
-2

Я пытаюсь выполнить EXEC, соединяющий связанный сервер, но он не работает с использованием переменной таблицы.Должен объявить скалярную переменную @Table при использовании связанного сервера. EXEC

Есть ли какое-либо исправление для этого?

Мой код:

DECLARE @Table TABLE(
    ID VARCHAR(8), 
    DATA DATE, 
    DIA VARCHAR(2), 
    MES VARCHAR(2), 
    ANO VARCHAR(4) 
) 

INSERT INTO @Table SELECT * FROM LOCALTABLE 

EXEC ('INSERT INTO SERVER2TABLE SELECT * FROM ' + @Table) AT SERVER2; 

Ошибка:

Must declare the scalar variable "@Table". 

Мои серверы:

SQL SERVER 2008 R2 Linked Server с помощью MySQL ODBC 5.1 Драйвер MySQL 5.6.8

+1

См. [Ответ от Мартина Смита] (http://stackoverflow.com/questions/4626292/how-to-use-table-variable-in-a-dynamic-sql-statement), если вы хотите взаимодействовать с вашей переменной таблицы как внутри, так и вне инструкции EXEC. –

+1

, пожалуйста, уточните свой вопрос, ваш вопрос и комментарии говорят по-другому. – TheGameiswar

+0

исправил вопрос. спасибо – saulob

ответ

0

попробуйте это однажды: я не уверен, как вы заполняете данные в переменную таблицы, но в соответствии с вашим op, thi s будет работать

EXEC (' 
DECLARE @Table TABLE(
    ID VARCHAR(8), 
    DATA DATE, 
    DIA VARCHAR(2), 
    MES VARCHAR(2), 
    ANO VARCHAR(4) 
) 

INSERT INTO SERVER2TABLE SELECT * FROM @Table') AT SERVER2; 
+0

FYI для тех, кто читает это ... '@ Table' здесь полностью отделен от любого @Table, объявленного в остальной части кода. Все, что находится внутри строки, находится в совершенно другой области, поэтому любые данные в '@ Table' в остальной части кода будут недоступны. –

+0

Да, это проблема. Я тоже заполняю. – saulob

+0

EXEC - это серийный разделитель, и ожидается, что ответ будет дан конкретным оператору – TheGameiswar

0

Вы не можете использовать табличную переменную как и в динамическом SQL, даже если бы это было не Linked Server. @Table - это таблица, а не строка, поэтому вы не можете просто добавить ее в строку. Даже если вы использовали его как имя, он все равно не сработает, потому что эта переменная больше не находится в области EXEC.

Вы пытались вставить непосредственно на связанный сервер? Я считаю, что синтаксис таков:

INSERT INTO SERVER2...SERVER2TABLE (id, data, dia, mes, ano) 
SELECT id, data, dia, mes, ano 
FROM @Table 

Это предполагает, что имена столбцов являются одинаковыми в вашей целевой таблице (SERVER2TABLE).

+0

Я вставляю прямо сегодня. Но проблема в том, что с помощью этой команды «Связанный сервер» делает '' select * server2table'' перед любым запросом. Решение использует команду 'exec'. Вот почему я пытаюсь его использовать. – saulob

+0

Я предполагаю, что он делает что-то вроде 'SELECT * FROM table WHERE 1 = 0', чтобы он мог получить структуру таблицы. На самом деле это не пытается перебрать полный набор данных. –

+0

Мысль о том. Но, глядя на журналы MySQL, запрос выводит все строки (более 29 миллионов) и занимает более 30 минут. – saulob