проблема с многозначной табличной функцией

#sql-server-2008 #dynamic-programming #dynamic-sql #sql-function

#sql-server-2008 #динамическое программирование #динамический-sql #sql-функция

Вопрос:

У меня проблема с многозначной табличной функцией. Что не так с этим кодом

 SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO

CREATE FUNCTION FN_BFS_CFS_BALANCE_VIW
(
    @param1 VARCHAR
)
RETURNS @table TABLE
(
    DAT VARCHAR
  , COD_ACN_KOL VARCHAR
  , DES_ACN_KOL VARCHAR
  , COD_ACN_MOIN VARCHAR
  , DES_ACN_MOIN VARCHAR
  , COD_ACN_TAFSIL VARCHAR
  , DES_ACN_TAFSIL VARCHAR
  , COD_FAREI1 VARCHAR
  , DES_FAREI1 VARCHAR
  , COD_FAREI2 VARCHAR
  , DES_FAREI2 VARCHAR
  , TYP_FRGN INT
  , DES_FRGN VARCHAR
  , TYP_DPN INT
  , DES_DPN VARCHAR
  , FLG_129 INT
  , DES_129 VARCHAR
  , AMN_DBT INT
  , AMN_CRD INT
  , COD_MONEY VARCHAR
  , DES_MONEY VARCHAR
  , AMN_DBT_FRGN INT
  , AMN_CRD_FRGN INT
)
AS
BEGIN

    EXEC (' call tpout.set_context(''PARAM1'','   ''   @param1   ''   ' AT [LS_New2CFS]');

    SELECT DAT
         , COD_ACN_KOL
         , DES_ACN_KOL
         , COD_ACN_MOIN
         , DES_ACN_MOIN
         , COD_ACN_TAFSIL
         , DES_ACN_TAFSIL
         , COD_FAREI1
         , DES_FAREI1
         , COD_FAREI2
         , DES_FAREI2
         , TYP_FRGN
         , DES_FRGN
         , TYP_DPN
         , DES_DPN
         , FLG_129
         , DES_129
         , AMN_DBT
         , AMN_CRD
         , COD_MONEY
         , DES_MONEY
         , AMN_DBT_FRGN
         , AMN_CRD_FRGN
    FROM LS_New2CFS..TPOUT.BFS_CFS_BALANCE_VIW;


    RETURN;

END;
  

когда я выполняю этот код, появляется эта ошибка.

PS: [LS_New2CFS] является Oracle link server. [BFS_CFS_BALANCE_VIW] это представление в базе данных Oracle.

Сообщение 444, уровень 16, состояние 2, процедура FN_BFS_CFS_BALANCE_VIW, строка 37 [Строка запуска пакета 5]
Недопустимое использование побочного оператора ‘EXECUTE STRING’ внутри функции.

Сообщение 443, уровень 16, состояние 14, процедура FN_BFS_CFS_BALANCE_VIW, строка 33 [Строка запуска пакета 5]
Операторы выбора, включенные в функцию, не могут возвращать данные клиенту.

Благодаря вам

Комментарии:

1. Функции не могут вызывать хранимые процедуры. Кроме того, чтобы использовать TVF с несколькими инструкциями, вам нужно вставить данные в таблицу, которую вы объявили в функции, а затем вернуть эту таблицу. т. е. INSERT @table (<columns>) SELECT <columns> FROM dbo.View; RETURN @Table; . В качестве отступа, это, вероятно, стоит прочитать: Вредные привычки, от которых нужно отказаться: объявление VARCHAR без (длины)

2. В качестве дополнительного примечания: SQL Server 2008 и 2008 R2 к настоящему времени не имеют расширенной поддержки red-gate.com/simple-talk/sql/database-administration/… — время обновления!

3. Привет, Гарет благодарит за его работу. И я попытался исправить свои привычки.