为多行选择序列NEXTVAL

时间:2012-11-19 17:50:08

标签: sql sql-server oracle oracle10g linked-server

我正在构建一个SQL Server作业,通过链接服务器将数据从SQL Server提取到Oracle数据库中。我需要填充的表有一个名称ID的序列,这是我的主键。我很难找到一种方法来做到这一点,没有一些冗长的代码。这是我到目前为止对SELECT部分​​(一些实际名称混淆):

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

3 个答案:

答案 0 :(得分:3)

将它放在SQL标量函数中。例如:

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

答案 1 :(得分:0)

我最终不得不遍历所有记录并单独设置ID值。凌乱而缓慢,但它似乎是这种情况下的唯一选择。

答案 2 :(得分:0)

非常简单只需使用CURSOR迭代代码:

if(strpos("1,2,3", $row['name']) !== false) && $Cond2) {
  doThis();
}

所以你可以在任何Sql语句中嵌入这个select语句,并由CURSOR迭代。

PS:

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

FROM Person psn LEFT JOIN MYSERVER..ORCL.COUNTRY c ON c.COUNTRY_CODE = psn.Country

OPEN SQCURS FETCH NEXT来自SQCURS;

我希望有帮助