2016-02-15 62 views
1

移動一個表在當時是沒有問題的,我對這個查詢,但我有我需要提取幾次表的數量較多,所以我想要一個爲我做的腳本。移動了一些從一個數據庫表到另一個使用linkedserver

基本上它是這個代碼,我需要在SQL,但不知道怎麼寫。從他們應該結束了DB執行

for @TableName in ('TABLE1','TABLE2','TABLE3') 

SELECT * 
INTO [email protected] 
FROM 
OPENQUERY (LINKEDSERVER,'SELECT * FROM @TableName') 

End 
+0

不能這樣做。只需編制你需要的表格。 – Jeremy

+0

你是怎麼說出來的? – user3007811

+0

創建一個將轉移所有表的sql腳本。將其保存爲存儲過程或常規SQL腳本,然後在需要傳輸數據時執行。如果定期調度,則創建一個sql作業以定期調用存儲過程來移動數據。 – Jeremy

回答

1

你可以使用光標的FOM表和循環列表通過這一點。然後添加更多表格,您只需將它們添加到list_of_tables:

declare @tablename nvarchar(128); 
declare @sqlquery nvarchar(max); 

declare d cursor for 
select tablename from (
select 'Table1' as tablename 
union 
select 'Table2' as tablename 
union 
select 'Table3' as tablename) as list_of_tables; 

open d; 
    fetch next from d into @tablename; 
    while @@fetch_status = 0 
    begin 
     set @sqlquery = 'SELECT * INTO SCHEMA.' + QUOTENAME(@TableName) + ' 
        FROM 
        OPENQUERY (LINKEDSERVER,''SELECT * FROM ' + QUOTENAME(@TableName)+ ''');' 
     exec (@sqlquery); 
     fetch next from d into @tablename; 
    end; 
close d; 
deallocate d; 
+0

您好,感謝您的回答,不知何故,似乎沒有找到查詢或存儲過程中,信息獲取: @sqlquery 找不到存儲過程「SELECT * INTO SCHEMA.TABLE1 FROM OPENQUERY(LINKEDSERVER」 SELECT * FROM TABLE1');'。 消息:2812,等級:16,狀態:62,步驟:行:21 未能找出原因,任何想法? – user3007811

+0

哎呀,我忘在線路EXEC(@sqlquery)括號;回答編輯 - 給一個去! – BeanFrog

+0

只是一個快速警告:這隻會複製表結構。沒有約束(默認,外鍵,...),索引或主鍵將被複制。 –

0

您可以從sys.objects

如生成腳本:

SELECT 
     'SELECT * 
     INTO Schema.' + SO.name + ' 
     FROM 
      OPENQUERY(LINKEDSERVER, ''SELECT * FROM ' + SO.name + ''') 
     ' 
    FROM 
     OPENQUERY(LINKEDSERVER 
        , 'SELECT * FROM sys.objects WHERE type = ''U''') SO 
相關問題