1

リンクサーバーを介してSQLServerからOracleデータベースにデータをプルするSQLServerジョブを構築しています。入力する必要のあるテーブルには、主キーである名前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は、クエリが実行されているSQLServerデータベース上のローカルテーブルです。

このクエリを実行すると、NEXTVALのすべてのレコードに対して同じ正確な値が得られます。必要なのは、返されたレコードごとに新しい値を生成することです。

私はこの同様の質問とその答えを見つけましたが、それを私のケースに適用する方法がわかりません(可能であれば):1つのステートメントでシーケンスからいくつかのNEXTVALをクエリします

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 に答える