Sql server 内联执行存储过程,类似于UDF?

Sql server 内联执行存储过程,类似于UDF?,sql-server,tsql,stored-procedures,sql-server-2008-r2,user-defined-functions,Sql Server,Tsql,Stored Procedures,Sql Server 2008 R2,User Defined Functions,我的结构与此类似: Company ( CompanyID CompanyLastTransactionNo ) Transaction ( TransactionID CompanyID CompanyTransactionNo TransactionAmount ) 然后我有一个程序,它可以做如下事情: INSERT INTO Transaction (CompanyID, CompanyTransactionNo, TransactionAmount) SELE

我的结构与此类似:

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
编译时,我得到:

Msg 443,16级,状态15,程序fns\U fn\U GetNextCompanyTrancationNo,第19行 在函数中无效使用副作用运算符“UPDATE”

嗯。完全忘记了

所以这里是我的问题,有没有一种方法可以使用一个存储的进程作为一个内联函数,类似于这个?也许这是一个糟糕的方法


我有点被我的表卡住了,否则我会用序列来获得下一个数字?

这是个坏主意。具有副作用的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
创建表t(id INT)
插入t(id)值(1)
插入t(id)值(2)
插入t(id)值(3)
插入t(id)值(4)
插入t(id)值(5)
插入t(id)值(6)
插入t(id)值(7)
插入t(id)值(8)
插入t(id)值(9)
插入t(id)值(10)

从t中选择id,dbo.myUDF(),其中t.id是您提到的序列:您使用的是SQL Server 2012吗?不,使用的是2008 R2。是的,我知道序列要到2012年才可用。但我应该澄清。现在是2008R2。我希望这样做,坦率地说,如果这是UDF中禁止副作用的唯一原因,那就是一个可怕的原因。在任何SQL实现中,都有各种各样的东西是以未定义的顺序执行的,我们使用它们。我想做的只是从t
中选择id,dbo.myUDF(id)。我将通过一个过程在一个循环中完成它,但这会更干净。