【问题标题】:Selecting a sequence NEXTVAL for multiple rows为多行选择一个序列 NEXTVAL
【发布时间】:2012-11-07 16:49:56
【问题描述】:

我正在构建一个 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

【问题讨论】:

  • select 查询如何将数据传输到 Oracle 数据库中?
  • 我认为 OP 的意思是 from 而不是 into
  • 它只是做一个简单的插入。我没有包含那部分代码,因为我觉得这个问题没有必要。
  • 我不相信我在问题的任何地方都说过into。编辑:我知道你在哪里感到困惑。是的,它最终会插入到 Oracle 表中,但我只发布了 select 部分,因为这是我现在需要知道的。 insert 无关紧要。
  • 我无意对那个评论无礼;如果那是它所采取的,我深表歉意。我已经找到了一种方法,方法是使用 Oracle 端的表并从中选择序列值,但不幸的是,这不是一个选项,因为我从中选择的表位于 SQL Server 上,而我必须OPENQUERY Oracle 数据库获取序列号。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      所以你可以在任何 Sql 语句中嵌入这个 select 语句,并通过 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
      

      来自个人 psn LEFT JOIN MYSERVER..ORCL.COUNTRY c ON c.COUNTRY_CODE = psn.Country

      打开 SQCURS 从 SQCURS 获取下一个;

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2015-01-14
        • 1970-01-01
        • 2017-04-26
        • 2011-02-16
        • 2015-03-03
        • 1970-01-01
        • 2020-09-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多