Выполнить Хранимую процедуру, Действующую, подобную UDF?

У меня есть структура, подобная этому:

Company
(
  CompanyID
  CompanyLastTransactionNo
)

Transaction
(
  TransactionID
  CompanyID
  CompanyTransactionNo
  TransactionAmount
)

Таким образом у меня есть процедура, которая делает что-то как:

INSERT INTO Transaction
(CompanyID, CompanyTransactionNo, TransactionAmount)
SELECT 
   CompanyID,
   fn_GetNextCompanyTrancationNo(CompanyID),
   TransactionAmount
FROM
   LoadingTable


CREATE FUNCTION [dbo].[fn_GetNextCompanyTrancationNo]
(
 @CompanyID CHAR(10)
)
RETURNS INT
AS
BEGIN
    DECLARE @trxno int
           DECLARE @trxnoNew int

    SELECT @trxno = CompanyLastTransactionNo
    FROM dbo.Company
    WHERE ID = @CompanyID;

    SET @trxnoNew = @trxno + 1;

    UPDATE dbo.Company
    SET CompanyLastTransactionNo = @trxnoNew
    WHERE CompanyID = @CompanyID;


    RETURN @trxno

END

Собирая я добираюсь:

Сообщение 443, Уровень 16, государственные 15, Процедура fns_fn_GetNextCompanyTrancationNo, Линия 19 Недействительное использование производящего сторону оператора 'ОБНОВЛЯЕТ' в функции.

ПОНЯТНОЕ ДЕЛО. Полностью забыл об этом.

Таким образом, вот мой вопрос, есть ли способ использовать Сохраненный Proc в качестве подставляемой функции, similiar к этому? Возможно, это - плохой подход все вместе?

Я отчасти застреваю со столами, которые я имею, или я использовал бы последовательность, чтобы получить следующее число?

0
nl ja de
Вы упоминаете последовательности: вы используете SQL Server 2012?
добавлено автор Matt, источник
Нет, Используя 2008 R2. Да, я знаю Последовательность isn' t доступный до 2012. Но у меня должен быть clairified. It' s 2008R2.
добавлено автор Drew Jenkel, источник

1 ответы

Это - плохая идея. Проблема с UDF's, у которых есть побочные эффекты, состоит в том, что вы не имеете никакого контроля, когда/как это называют в контексте избранного заявления.

Рассмотрите следующее:

CREATE TABLE t (id INT )
INSERT INTO t (id) values (1)
INSERT INTO t (id) values (2)
INSERT INTO t (id) values (3)
INSERT INTO t (id) values (4)
INSERT INTO t (id) values (5)
INSERT INTO t (id) values (6)
INSERT INTO t (id) values (7)
INSERT INTO t (id) values (8)
INSERT INTO t (id) values (9)
INSERT INTO t (id) values (10)

SELECT id, dbo.myUDF() FROM t WHERE t.id <= 3 and dbo.myUDF() = @someValue

То, сколько раз делает myUDF() называют? 10? 3? 13? или 20?

Определенно, нет ничего в языковом стандарте SQL, который диктует заказ в который предикаты быть примененным.

0
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)