2016-02-24 31 views
-2

我試圖執行一個EXEC連接鏈接服務器,但它不能使用表變量。使用鏈接服務器時必須聲明標量變量@Table執行代碼

有沒有解決這個問題?

我的代碼:

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中使用MySQL ODBC 5.1驅動的MySQL R2 LINKED SERVER 5.6.8

+1

請參閱[Martin Smith的答案](http://stackoverflow.com/questions/4626292/how-to-use-table-variable-in-a-dynamic-sql-statement),如果您想要互動在EXEC語句的內部和外部使用您的表變量。 –

+1

請清楚地更新你的問題,你的問題和評論說不同 – TheGameiswar

+0

修復了這個問題。謝謝 – saulob

回答

0

嘗試一次:我不知道你是如何填充數據到表變量,但根據你的操作,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

對於那些閱讀這篇文章的參考文獻...這裏的@表格與其餘代碼中聲明的@Table完全分開。字符串中的任何內容都處於完全不同的範圍內,因此其餘代碼中的@表中的任何數據都將不可用。 –

+0

是的,這是問題所在。我也在填充。 – saulob

+0

EXEC是一個批處理分隔符,這是預期的並給出了具體的答案 – TheGameiswar

0

即使它不是鏈接服務器,也不能在動態SQL中使用類似這樣的表變量。 @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