0

我有一個類似的結構:執行內聯存儲過程,類似於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行 函數中副作用運算符'UPDATE'的無效使用。

DUH。完全忘記了這一點。

所以,這裏是我的問題,有沒有辦法使用存儲過程作爲內聯函數,類似於此?也許這是一個糟糕的做法嗎?

我有點卡住了我的桌子,或者我會用一個序列來獲得下一個數字?

+1

你提到序列:你使用SQL Server 2012嗎? – Matt

+0

不,使用2008 R2。是的,我知道序列直到2012年纔可用。但是我應該已經聲明。這是2008R2。 –

回答

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語言標準中沒有任何內容規定謂詞的應用順序。