2

我有一个从表中获取 nextID 的 SQL Server 函数。这很简单,但我还想更新所用 ID 的表。我正在使用该技术更新到表中,但更新并没有发生。代码如下所示,有人知道为什么吗?

CREATE FUNCTION [dbo].[GetNextKeyID]
(
 @user nvarchar(10),
 @keytype nvarchar(20) 
)
RETURNS nvarchar(15)
AS
BEGIN
    DECLARE @NextID nvarchar(15);

    -- get the next id for this keytype
    SELECT @NextID = @user + '_' + @keytype + '_' + CONVERT(VARCHAR(3), 
                                                            (SELECT CASE WHEN @keytype = 'sess' THEN SessionNext
                                                                         WHEN @keytype = 'event' THEN EventNext
                                                                         WHEN @keytype = 'evtc' THEN EventConsultantNext
                                                                         WHEN @keytype = 'act' THEN ActivityNext
                                                                     END)
                                                            )
    FROM dbo.[BARKeys]
    WHERE [UserID] = @user 

    -- increment the next id for this keytype
    DECLARE @BARKeys TABLE
    (
        UserID nvarchar(10),
        SessionNext int,
        EventNext int,
        EventConsultantNext int,
        ActivityNext int
    )

    UPDATE @BARKeys
    SET SessionNext         = CASE WHEN @keytype ='sess' OR @keytype = 'All' 
                                   THEN SessionNext + 1 
                                   ELSE SessionNext END
       ,EventNext           = CASE WHEN @keytype ='event' OR @keytype = 'All' 
                                   THEN EventNext + 1 
                                   ELSE EventNext END
       ,EventConsultantNext = CASE WHEN @keytype ='evtc' OR @keytype = 'All' 
                                   THEN EventConsultantNext + 1 
                                   ELSE EventConsultantNext END
       ,ActivityNext        = CASE WHEN @keytype ='act' OR @keytype = 'All' 
                                   THEN ActivityNext + 1 
                                   ELSE ActivityNext END
    WHERE [UserID] = @user

    -- return the next id
    RETURN  @NextID ;
END
4

3 回答 3

3

不,你不能这样做。函数是有readonly目的的。

用户定义的函数不能用于执行修改数据库状态的操作。

看看这个_

解决方法是创建一个存储过程

于 2013-08-26T14:44:21.783 回答
0

您不能修改函数内的表数据。

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql?view=sql-server-2017

于 2013-08-26T14:38:21.580 回答
0

看起来您正在尝试更新表变量,而不是物理表本身。此外,正如其他人所提到的,您无法在函数中更新物理表的数据。但是,您可以使用存储过程来执行此操作。您是否有要求使用 FUNCTION 的要求?

于 2013-08-26T14:44:38.453 回答