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)。我将通过一个过程在一个循环中完成它,但这会更干净。