2009-10-08 47 views
2

我在通過鏈接服務器嘗試調用具有參數的MySQL(5.0.77)存儲過程時遇到問題(SQL Server 2005)使用OPENQUERY語法。使用OPENQUERY語法通過鏈接服務器(SQL Server 2005)調用MySQL存儲過程(帶參數)問題

MySQL的存儲過程返回結果集,當我使用「EXEC ... AT ......」語法調用工作正常,如..

EXEC('CALL my_stored_proc(''2009-10-07'',''2009-10-07'');') AT MySQLSERVER; 

的使用「EXEC的限制... AT ...'表示我無法將結果集插入到SQL Server中的臨時表中,這最終是我想要做的。這使我嘗試OPENQUERY語法...

SELECT * FROM OPENQUERY(MySQLSERVER,'CALL my_stored_proc(''2009-10-07'',''2009-10-07'');') 

...但是這個失敗,並返回...

Msg 7357, Level 16, State 2, Line 1 
Cannot process the object "CALL my_stored_proc(''2009-10-07'',''2009-10-07'');". The OLE DB provider "MSDASQL" for linked server "MySQLSERVER" indicates that either the object has no columns or the current user does not have permissions on that object. 

這是奇怪的,因爲該「EXEC ... AT ......'電話沒有抱怨權限。下面的調用都做工精細...

EXEC('SHOW TABLES;') AT MySQLSERVER; 

SELECT * FROM OPENQUERY(MySQLSERVER,'SHOW TABLES;'); 

CREATE TABLE #tmpTest (
    [table] varchar(255) null 
); 
INSERT INTO #tmpTest ([table]) 
SELECT * FROM OPENQUERY(MySQLSERVER,'SHOW TABLES;'); 
SELECT * FROM #tmpTest; 
DROP TABLE #tmpTest; 

所以我的問題是,如何才能讓一個MySQL存儲過程的調用,通過鏈接服務器,並將結果存儲在一個臨時表中的SQL Server設置?通過使用'EXEC ... AT ...'語法,或者在使用OPENQUERY語法時解決對象/權限錯誤。

任何幫助將不勝感激!

回答

3

您需要在SQL Server上啓用「Ad Hoc分佈式查詢」。出於安全原因,這不是默認啓用的。大多數情況下,「沒有許可」錯誤與此相關。

的SQL服務器上執行此操作,然後再次嘗試代碼:

 
EXEC sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
EXEC sp_configure 'Ad Hoc Distributed Queries', 1; 
GO 
RECONFIGURE; 
GO 

我希望它能幫助。

4

我試圖修復配置「特設分佈式查詢」,但仍然得到同樣的錯誤:

  • 「OLE DB提供程序‘MSDASQL’鏈接服務器‘MyMySQL’表示 ,要麼對象沒有列或當前用戶沒有 對該對象具有權限。「

我正在嘗試一個簡單的遠程SELECT查詢對鏈接的MySQL數據庫。 在我的情況下,我嘗試的查詢看起來像這樣。請注意所使用的行數:

SELECT * FROM OPENQUERY 
([MyMySQL], 
' 
SELECT 
ID as ISSUE_ID, etc.. 

修復是在打開單引號後刪除換行符。簡單,是吧?但並不明顯。

下面所示的工作代碼:

SELECT * FROM OPENQUERY 
([MyMySQL], 
'SELECT 
ID as ISSUE_ID, etc.. 

希望它能幫助! Rob

0

我意識到這是一個很老的帖子,但是我的問題與Rob的相似之處在於OPENQUERY中的SQL不像SQL服務器那樣使用空格作爲空格。

即鋪設了我的查詢,如下所示:

SELECT 
    * 
FROM 
    OPENQUERY(LINKEDSERVER, ' 
     SELECT 
      SomeField 
     FROM 
      SomeTable 
    ') 

需要有空格,就好像它寫在一行上(使用_作爲示範可視空間):

SELECT 
    * 
FROM 
    OPENQUERY(LINKEDSERVER, ' 
     SELECT_ 
      SomeField_ 
     FROM_ 
      SomeTable 
    ') 
相關問題