2016-03-24 67 views
1

リンクされたOracleデータベースから選択するSQL Serverの一部のクエリでエラーが発生します。エラーは一部のSELECTステートメントでのみ発生しますが、他のステートメントでは発生しません。私は2つのサーバー上のデータを比較しようとしており、一方には存在するレコードを取得しますが他方には存在しません。リンクされたサーバー(OracleにリンクされたSQL Server)からクエリするときのSQLエラー

私はこのクエリが期待される結果を返すため、Oracleデータベース・リンクが機能知っている:

SELECT * 
FROM dbo.MY_TABLE 
WHERE TABLE_ID NOT IN 
(
    SELECT TABLE_ID 
    FROM [OraDevLink]..[SCHEMA].[MY_TABLE] 
); 

このクエリで、ほぼ同じです:

SELECT TABLE_ID 
FROM [OraDevLink]..[SCHEMA].[MY_TABLE]; 

ここで正常に動作する別のクエリがあります上記の1つだけですが、結果を少しフィルタリングしようとすると、エラーメッセージが返されます(最後の行だけが異なります)。

SELECT * 
FROM dbo.MY_TABLE 
WHERE TABLE_ID NOT IN 
(
    SELECT TABLE_ID 
    FROM [OraDevLink]..[SCHEMA].[MY_TABLE] 
) 
AND TABLE_ID IN(0, 100); 

ここでエラーメッセージです:

OLE DBプロバイダ "OraOLEDB.Oracle" リンクサーバー "OraDevLink" 返されたメッセージ "ORA-01403:データが見つかりません" のために。
メッセージレベル7,166、レベル16、状態2、レベル1
リンクサーバー "OraDevLink"のOLE DBプロバイダ "OraOLEDB.Oracle"から行のデータを取得できません。

私が最終的にやってみたいのは、不足しているレコード(フィルタ付き)を探すINSERT文を実行することです。

INSERT INTO [OraDevLink]..[SCHEMA].[MY_TABLE] 
(TABLE_ID) 
SELECT TABLE_ID 
FROM dbo.MY_TABLE 
WHERE TABLE_ID NOT IN 
(
    SELECT TABLE_ID 
    FROM [OraDevLink]..[SCHEMA].[MY_TABLE] 
); 

をしかし、これは同じ上記のエラーメッセージを返します:これは正しく動作

INSERT INTO [OraDevLink]..[SCHEMA].[MY_TABLE] 
(TABLE_ID) 
SELECT TABLE_ID 
FROM dbo.MY_TABLE 
WHERE DEPT_ID = 1 -- this is the only change 
AND TABLE_ID NOT IN 
(
    SELECT TABLE_ID 
    FROM [OraDevLink]..[SCHEMA].[MY_TABLE] 
); 

EDIT

それは悪化します。次の2つのクエリの違いを確認できるかどうかを確認してください:

SELECT * 
FROM dbo.MY_TABLE 
WHERE TABLE_ID NOT IN 
(
    SELECT TABLE_ID 
    FROM [OraDevLink]..[SCHEMA].[MY_TABLE] 
) 
AND TABLE_ID IN(0); 

SELECT * 
FROM dbo.MY_TABLE 
WHERE TABLE_ID NOT IN 
(
    SELECT TABLE_ID 
    FROM [OraDevLink]..[SCHEMA].[MY_TABLE] 
) 
AND TABLE_ID IN(0, 100); -- <-Hint 

最初の作品です。 2番目はエラーを投げます!

+0

Oracleデータベースにログインし、 'SELECT SUBMISSION_ID FROM AIRBRANCH.GST_SUB_SUBMISSION'を実行するとどうなりますか?そして、 'WHERE SUBMISSION_ID IN(0、100)'をクエリに追加するとどうなりますか? –

+0

@BobJarvis期待どおりに動作します。エラーはありません。 – Doug

答えて

2

これはバグだと思うことができます。この動作について他の説明はありません。

私の回避策は次のとおりです。テンポラリテーブルを作成して代わりに使用します。

SELECT TABLE_ID 
INTO #temp_table 
FROM [OraDevLink]..[SCHEMA].[MY_TABLE]; 

SELECT * 
FROM dbo.MY_TABLE 
WHERE TABLE_ID NOT IN 
(
    SELECT TABLE_ID 
    FROM #temp_table 
) 
AND TABLE_ID IN(0, 100); 

これが必要な理由はなく、パフォーマンスはおそらくヒットしますが、少なくとも機能します。

関連する問題