#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. Привет, Гарет благодарит за его работу. И я попытался исправить свои привычки.