我正在构建一个 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 的所有记录获得相同的精确值。我需要的是它为每个返回的记录生成一个新值。
我发现了这个类似的问题及其答案,但不确定如何将其应用于我的案例(如果可能的话):在一个语句中从序列中查询多个 NEXTVAL
将其放入 SQL 标量函数中。示例:
CREATE function [dbo].SEQ_PERSON()
returns bigint as
begin
return
( select NEXTVAL
from openquery(oraLinkedServer, 'select SEQ_PERSON.NEXTVAL FROM DUAL')
)
end
我最终不得不遍历所有记录并单独设置 ID 值。又乱又慢,但这似乎是这种情况下唯一的选择。
非常简单,只需使用光标即可迭代代码:
SELECT NEXTVAL AS SQ from OPENQUERY(MYSERVER, 'SELECT AC2012.NAME_SEQNO.NEXTVAL FROM DUAL')
所以你可以将这个select语句嵌入到任何Sql语句中,并通过游标进行迭代。
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 左加入 MYSERVER..ORCL.COUNTRY c ON c.COUNTRY_CODE = psn.Country
打开方格 从 SQCURS 获取下一个;
希望有帮助
有谁知道如何获取从 SQL 存储过程创建的序列的下一个值?
上面讲的是oracle sql命令,但我在任何地方都找不到等效的SQL语法。
有人告诉我这可以在 SQL 上运行,但我相信它是基于 Oracle 的。
从 DUAL 中选择 Seq_name.nextval;