我正在构建一个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
答案 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;
我希望有帮助