2012-11-19 59 views
1

我正在構建一個SQL Server作業,通過鏈接服務器將數據從SQL Server中提取到Oracle數據庫中。我需要填充的表有一個名稱ID序列,這是我的主鍵。我很難找出簡單的方法,沒有一些冗長的代碼。這裏是我迄今爲止的SELECT部分​​(混淆了一些實際的名稱):爲多行選擇一個序列NEXTVAL

SELECT (SELECT NEXTVAL FROM OPENQUERY(MYSERVER, 
    'SELECT ORCL.NAME_SEQNO.NEXTVAL FROM DUAL')), 
    psn.BirthDate, psn.FirstName, 
    psn.MiddleName, psn.LastName, c.REGION_CODE 
FROM Person psn 
LEFT JOIN MYSERVER..ORCL.COUNTRY c ON c.COUNTRY_CODE = psn.Country 

MYSERVER被鏈接的Oracle服務器,ORCL是明顯的模式。 Person是執行查詢的SQL Server數據庫上的本地表。

當我運行此查詢時,我得到了NEXTVAL的所有記錄相同的確切值。我需要的是它爲每個返回的記錄生成一個新的值。

我發現這個類似的問題,其答案,但我不能確定如何將其應用到我的情況(如果甚至有可能):Query several NEXTVAL from sequence in one statement

+0

這個'select'查詢如何將數據傳輸到Oracle數據庫中? – Andomar

+0

我認爲OP的意思是'從'不'進''。 –

+0

這只是做一個簡單的插入。我沒有包含這部分代碼,因爲我不覺得這個問題是必要的。 – stringpoet

回答

0

我最後不得不通過所有的記錄進行迭代,並設置ID價值。凌亂和緩慢,但它似乎是在這種情況下唯一的選擇。

3

把它放在SQL標量函數中。例如:

CREATE function [dbo].SEQ_PERSON() 
returns bigint as 
begin 
    return 
    ( select NEXTVAL 
     from openquery(oraLinkedServer, 'select SEQ_PERSON.NEXTVAL FROM DUAL') 
    ) 
end 
0

非常簡單,只要使用遊標的代碼重述:

SELECT NEXTVAL AS SQ from OPENQUERY(MYSERVER, 'SELECT AC2012.NAME_SEQNO.NEXTVAL FROM DUAL') 

所以,你可以將光標在任何SQL語句中嵌入此select語句,並反覆測試。

PS:

DECLARE SQCURS CURSOR 
FOR SELECT (SELECT NEXTVAL AS SQ FROM OPENQUERY(MYSERVER, 
'SELECT ORCL.NAME_SEQNO.NEXTVAL FROM DUAL')), 
psn.BirthDate, psn.FirstName, psn.MiddleName, psn.LastName, c.REGION_CODE 

由人PSN LEFT JOIN MYSERVER..ORCL.COUNTRY C ON c.COUNTRY_CODE = psn.Country

OPEN SQCURS FETCH NEXT FROM SQCURS;

我希望能幫到