2009-07-24 7 views
0

ms SQLサーバーのリンクサーバー機能を使用してoracle 10gサーバーに接続していましたが、何らかの理由でwith節を使用できません。この句は、pl/sqlコンソールでしか動作しませんか、それともリンクサーバーでも動作させるためにできることはありますか?With節はリンクサーバーでは機能しません

私は取得していますエラーが

Msg 7357, Level 16, State 2, Line 1 
Cannot process the object " 

編集です:ちょうど私はリンクサーバーに

SELECT * 
FROM OPENQUERY(LINKED_SERVER_ORACLE, 
' 
    WITH assignment_t AS (
     SELECT ''1x'' ID, 2 type_id, 554 assign_id FROM dual UNION ALL 
     SELECT ''1x'', 3, 664 FROM dual UNION ALL 
     SELECT ''2x'', 2, 919 FROM dual UNION ALL 
     SELECT ''2x'', 4, 514 FROM dual 
    ), type_t AS (
     SELECT 1 type_id, DATE ''2009-01-01'' create_date FROM dual UNION ALL 
     SELECT 2, DATE ''2009-01-01'' FROM dual UNION ALL 
     SELECT 3, DATE ''2009-01-03'' FROM dual UNION ALL 
     SELECT 4, DATE ''2009-01-04'' FROM dual 
    ) 
    SELECT DISTINCT a.* 
    FROM assignment_t a 
    JOIN type_t t ON (a.type_id = t.type_id) 
    ' 
    ) AS QUERY 

おかげ

+0

例外の原因となっているステートメントのスニペットを投稿してください。診断がずっと楽になります! –

答えて

1

technet.microsoft.comによると、OPENQUERYの対象はOLE DBデータソースでなければなりません。 「これはOLE DBプロバイダの能力に左右される」

私の推測によれば、OLE DBプロバイダは、Oracleデータベース自体が(少なくとも9ir2以降)ことができるという事実にもかかわらず、WITH句の処理方法を知らないということです。

+0

ありがとうございます。それが私の考えです。 – zSynopsis

0

WITHを照会するOPENQUERYを使用していることを追加しようと思いましたキーワードはANSI予約済みです。 SQL Serverでは、共通テーブル式にWITHキーワードが使用されています。私はPL/SQLとそのWITHキーワードに関する正確な構文に精通していません。私の唯一の提案は、OpenQueryメソッドで送信しているステートメントがPL/SQLパーサー/コンパイラに対して有効なステートメントであることを確認することです。

あなたが送信しているクエリについての難しいことは、列のエイリアシング中に単一引用符をエスケープすることです。おそらくそれが調査する1つの場所です。

+0

私はクエリを実行するためにopenqueryを使用しています。私はsqlが今それを解析するとは思わない? – zSynopsis

+0

ちょうど注記:* PL/SQL *はOracleのSQLへのプロシージャ拡張です。ここでは使用されていません。 WITHは、PL/SQLではなく、Oracle SQLの最新バージョンの構文要素です。 –

1

以下のクエリを試してください。サブクエリ内でwith句を呼び出すと動作します。

SELECT * 
FROM OPENQUERY(LINKED_SERVER_ORACLE, 
' 
    select * from ( WITH assignment_t AS (
     SELECT ''1x'' ID, 2 type_id, 554 assign_id FROM dual UNION ALL 
     SELECT ''1x'', 3, 664 FROM dual UNION ALL 
     SELECT ''2x'', 2, 919 FROM dual UNION ALL 
     SELECT ''2x'', 4, 514 FROM dual 
    ), type_t AS (
     SELECT 1 type_id, DATE ''2009-01-01'' create_date FROM dual UNION ALL 
     SELECT 2, DATE ''2009-01-01'' FROM dual UNION ALL 
     SELECT 3, DATE ''2009-01-03'' FROM dual UNION ALL 
     SELECT 4, DATE ''2009-01-04'' FROM dual 
    ) 
    SELECT DISTINCT a.* 
     FROM assignment_t a 
     JOIN type_t t ON (a.type_id = t.type_id)) 
' 
) AS QUERY 
関連する問題