Создайте вид, подобный этому:
CREATE VIEW MyView
AS
SELECT *
FROM OPENQUERY(myOracleDB, 'SELECT Field1, Field2 FROM Table1')
То есть включите столбцы, по которым вы будете фильтровать позже.
Затем вы можете создать скалярную функцию следующим образом:
CREATE FUNCTION fnCCStatus
@Param1 nvarchar(10),
@Param2 nvarchar(10)
AS BEGIN
RETURN (SELECT COUNT(*)
FROM MyView
WHERE Field1 = @Param1
AND Field2 = @Param2);
END;
EDIT
Поскольку вы настаиваете на включении параметров в OPENQUERY ...
Вид не может быть параметризован.
Функция должна использовать 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
).