2009-07-24 25 views
0

我一直在使用ms sql服務器鏈接服務器功能連接到oracle 10g服務器,出於某種原因,我無法使用with子句。這個子句只能在pl/sql控制檯中工作,還是有一些我可以做的事情來使它與鏈接服務器一起工作?使用子句不起作用鏈接服務器

我得到的錯誤是

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

編輯:想我要補充一點,我使用OPENQUERY來查詢鏈接服務器

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

請張貼引發異常的語句片段。這將使診斷更容易! – 2009-07-24 15:25:37

回答

1

根據technet.microsoft.com,OPENQUERY的目標必須是OLE DB數據源; 「這取決於OLE DB提供商的功能。」

我的猜測是OLE DB提供程序不知道如何處理WITH子句,儘管Oracle數據庫本身可以(至少從9ir2開始)。

0

WITH關鍵字是ANSI保留的。在SQL Server中,關鍵字WITH用於公用表表達式。我對PL/SQL及其關於WITH關鍵字的確切語法不熟悉。我唯一的建議是確保您在OpenQuery方法中發送的語句是PL/SQL分析器/編譯器的有效語句。

關於您要發送的查詢的棘手問題是在鋸掉列的同時轉義單引號。也許這是一個需要調查的地方。

+0

我正在使用openquery來運行查詢。我不認爲SQL會解析,現在呢? – zSynopsis 2009-07-24 15:07:58

+0

只需注意:* PL/SQL *是Oracle對SQL的程序擴展;它在這裏沒有被使用。 WITH是最近版本的Oracle SQL中的語法元素,而不是PL/SQL中的語法元素。 – 2009-07-25 05:29:27

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