2011-03-15 121 views
0

這一個是做我的頭......在SQL Server功能

使用Oracle數據我需要從Oracle檢索數據,並在SQL Server視圖,存儲過程或(最好)的標量函數中使用它。

,第一部分是創建一個存儲過程從Oracle

ALTER PROCEDURE [dbo].[spCCStatus] 
@Param1 nvarchar(10), 
@Param2 nvarchar(10) 
AS 

BEGIN 
SET NOCOUNT ON; 

DECLARE @sql_str nvarchar (300) 
SET @sql_str = 'select count(*) from openquery(myOracleDB,' + char(39) + 'SELECT  Field1, Field2 FROM Table1 WHERE Field1 = '+char(39)+char(39) + @Param1+ char(39) + char(39) + ' AND PERSON = '+char(39)+char(39)+ @Param2 +char(39)+char(39)+char(39)+')' 
EXEC (@sql_str) 

END 

執行上述SP工作正常檢索數據。

如何在視圖中使用此功能? 或者,我該如何將其轉換爲標量值函數。

回答

0

創建這樣一個觀點:

CREATE VIEW MyView 
AS 
SELECT * 
FROM OPENQUERY(myOracleDB, 'SELECT Field1, Field2 FROM Table1') 

也就是說,包括稍後將過濾的列。

然後您可以創建這樣的標量函數:因爲你堅持具有包含在OPENQUERY參數

CREATE FUNCTION fnCCStatus 
    @Param1 nvarchar(10), 
    @Param2 nvarchar(10) 
AS BEGIN 
    RETURN (SELECT COUNT(*) 
      FROM MyView 
      WHERE Field1 = @Param1 
      AND Field2 = @Param2); 
END; 

編輯

...

  • 視圖不能被參數化。

  • 函數將不得不僱用INSERT EXEC這是不允許的(不在函數中)。

因此,看起來你必須繼續使用存儲過程的方法。

雖然它可以被增強。您可以添加輸出參數以將動態查詢的結果作爲標量值返回。這樣你就可以在腳本中使用SP。 (但是,再一次,而不是在一個功能,您將被允許多達創建試圖通過輸出參數,以獲得結果的功能,但運行它會失敗此消息:Only functions and some extended stored procedures can be executed from within a function.

這是你的存儲過程可以什麼樣子:

ALTER PROCEDURE [dbo].[spCCStatus] 
@Param1 nvarchar(10), 
@Param2 nvarchar(10), 
@Count int OUTPUT 
AS 

BEGIN 
SET NOCOUNT ON; 

DECLARE @sql_str nvarchar (300); 
DECLARE @result TABLE (cnt int); 
SET @sql_str = 'select count(*) from openquery(myOracleDB,' + char(39) 
      + 'SELECT Field1, Field2 FROM Table1 WHERE Field1 = ' 
      + char(39) + char(39) + @Param1 + char(39) + char(39) + ' AND PERSON = ' 
      + char(39) + char(39) + @Param2 + char(39) + char(39) + char(39) + ')' 
INSERT INTO @result 
EXEC (@sql_str); 
SELECT @Count = cnt FROM @result; 

END 

當在腳本中使用它,你將需要一個變量的結果返回到:

... 
DECLARE @QueryResult int; 
EXECUTE @Param1Value, @Param2Value, @QueryResult OUT; 
... 

應提供OUT(或OUTPUT)關鍵字以使其正常工作。

+0

一個優雅的解決方案,但不是我所需要的。參數必須包含在OPENQUERY中,否則超時發生。 – cymorg 2011-03-15 23:14:47

+0

@Morgan Matthews:更新了我的回答。 – 2011-03-16 00:23:41