2010-06-19 24 views
1

我們將數百萬條記錄插入到詳細信息表中,其數據以CSV格式存儲在主表中。爲了完成插入操作,我們使用了一個交叉應用函數,如果我一個接一個地插入,似乎可以工作,但是如果我執行整個插入操作,只有大約2/3的記錄進入,並且查詢剛剛停止,大約3個半小時後成功。會交叉申請保釋,但在SQL Server中沒有錯誤?

這裏的插入查詢

INSERT INTO DetailsTable(MasterTableID, DetailColumn1, DetailColumn2) 
    SELECT MasterTableID, DetailColumn1, DetailColumn2 FROM MasterTable 
    CROSS APPLY [fn_CreateDetailData](MasterTableID, '§') 

如果我做了以下爲沒有得到插入的記錄之一,寄託都將正常工作和有記錄插入就好

INSERT INTO DetailsTable(MasterTableID, DetailColumn1, DetailColumn2) 
    SELECT MasterTableID, DetailColumn1, DetailColumn2 FROM MasterTable 
    CROSS APPLY [fn_CreateDetailData](MasterTableID, '§') 
    WHERE MasterTableID = 12345 

從我所知道的關於SQL Server的所有事情來看,一個事務中存在單個插入語句,因此它的全部或全部都不存在,但這似乎並不是這種情況。

+2

發生這種情況的唯一原因是您的函數將其他行過濾掉。 向我們展示您的功能。 – 2010-06-19 03:16:24

+0

當我沒有指定主鍵ID時,我的函數如何過濾掉這些行,但是當我這樣做時不會將其過濾掉? 不幸的是,這看起來像是一個StackOverflow能夠處理的特定問題。 – 2010-06-19 22:01:47

+0

這是事情,如果我只是多次運行該函數,我會插入越來越多的新的獨特行,這似乎很奇怪。 – 2010-06-19 22:10:07

回答

2

這是究竟是你的代碼,對於SELECT?你有沒有遺漏任何細節,比如使用NOLOCK提示? NOLOCK因臭名昭着的數據引起的巨大差距,見Previously committed rows might be missed if NOLOCK hint is used

+0

那麼,它不完全是我的代碼,因爲我們並沒有真正的名爲MasterTable的表。但除了重命名列和表格外,這正是我運行的。 – 2010-06-19 12:03:31