2009-08-10 71 views
0

我執行簡單的插入查詢象下面這樣: INSERT INTO tbl_destination ... SELECT ... FROM [SomeOtherLinkedServer] .tbl_sourceSQL SERVER - INSERT INTO .. SELECT .. results in different no。插入時,選擇行..本身的

它導致3'000'儘管SELECT返回9'000'000行,但將000行插入到目標表中。原因是什麼? 我正在使用SQL Server 2005標準版。目標表和源表位於兩個不同的SQL服務器上。沒有顯示錯誤信息。目的地表格僅用作臨時數據堆 - 它沒有任何價值。鍵,沒有索引。我已經檢查了磁盤空間和tbl_destination的可用空間量 - 大量的GB。奇怪..我將不勝感激任何建議!

編輯: 謝謝您的建議,到目前爲止。 當我在本地(在鏈接的服務器上)運行SELECT COUNT(*)並且當記錄到鏈接服務器本身時,它顯示了9M行。 然而,當我跑的實際SELECT ...鏈接服務器上:

SELECT ... FROM [SomeOtherLinkedServer].tbl_source 

結果是3M行和任何錯誤消息。 登錄到遠程服務器時執行的相同的查詢:

SELECT ... FROM tbl_source 

也返回3M行,但這次使用錯誤消息(所以它看起來像沒有所有錯誤消息執行該鏈接服務器上使用表查詢時被示出) :

Msg 701, Level 17, State 123, Line 1 

There is insufficient system memory to run this query. 

所以現在看起來很清楚,這是內存問題。有沒有辦法(沒有在服務器上安裝更多的內存)來克服這個問題 - 將這個查詢的整個結果插入到表中?謝謝! 還有一件事 - tbl_source不是真的一張桌子,它的一個視圖。不幸的是,由其他人維護以優化其內部結構不是一種選擇(至少現在)。

+3

您可以發佈您的實際查詢爲你做的INSERT和你做的SELECT – 2009-08-10 15:04:32

+0

你有比較兩組數據要製作?更大的集合只有小集合中每行的三個副本? – 2009-08-10 15:04:44

+0

看看管理工作室的日誌 – Liao 2009-08-11 08:00:00

回答

0

如果目的地表格爲空,那麼您可以刪除表格並進行選擇。

select * into destination_table 
from [otherserver].otherdb.dbo.other_table 
+0

我通常不推薦SELECT-INTO。我會做一個CREATE,然後INSERT,因爲它讓事情變得更清潔。 – 2009-08-10 15:26:23

1

您是否考慮過對結果進行分區並對插入進行批處理?

Insert into... 
Select * from .... 
Where rowid between 0 and 1000000 


Insert into... 
Select * from .... 
Where field1 between 1000000 and 2000000 

...etc