創建這樣一個觀點:
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;
編輯
...
因此,看起來你必須繼續使用存儲過程的方法。
雖然它可以被增強。您可以添加輸出參數以將動態查詢的結果作爲標量值返回。這樣你就可以在腳本中使用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
)關鍵字以使其正常工作。
一個優雅的解決方案,但不是我所需要的。參數必須包含在OPENQUERY中,否則超時發生。 – cymorg 2011-03-15 23:14:47
@Morgan Matthews:更新了我的回答。 – 2011-03-16 00:23:41