0

我有一个类似于这样的结构:

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 行 在函数中无效使用副作用运算符“UPDATE”。

呃。完全忘记了这一点。

所以这是我的问题,有没有办法使用存储过程作为内联函数,类似于这个?也许这是一个不好的方法?

我有点卡在我的表上,或者我会使用一个序列来获得下一个数字?

4

1 回答 1

0

这是一个坏主意。具有副作用的 UDF 的问题是您无法控制在 select 语句的上下文中何时/如何调用它。

考虑以下:

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 语言标准中没有规定应用谓词的顺序。

于 2013-02-08T19:46:08.283 回答