1

我正在构建一个 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 multiple NEXTVAL from sequence in one statement

4

3 回答 3

3

把它放在一个 SQL 标量函数中。例子:

CREATE function [dbo].SEQ_PERSON() 
returns bigint as
begin
    return
    (   select NEXTVAL 
        from openquery(oraLinkedServer, 'select SEQ_PERSON.NEXTVAL FROM DUAL')
    )
end
于 2013-05-15T18:54:39.767 回答
0

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

于 2012-11-21T15:42:14.400 回答
0

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

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

所以你可以将这个select语句嵌入到任何Sql语句中,并通过CURSOR进行迭代。

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

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

打开 SQCURS 从 SQCURS 获取下一个;

我希望能有所帮助

于 2018-01-14T15:56:09.560 回答