Использование данных Oracle в функции SQL Server - PullRequest
0 голосов
/ 15 марта 2011

Этот делает мою голову в ...

Мне нужно извлечь данные из 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 отлично работает.

Как мне использовать это в представлении? В качестве альтернативы, как мне преобразовать это в скалярную функцию.

1 Ответ

0 голосов
/ 15 марта 2011

Создайте вид, подобный этому:

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).

...