Skip Navigation Links
Home
Articles
SQL Server 2012
SQL Server 2014
SQL Server 2016
FAQ
Practice Test
Tip of the Day : SQL Server Database Design - Internet Movie Database (IMDb)
Error Messages
Home > SQL Server Error Messages > Msg 443 - Invalid use of 'UPDATE' within a function.
SQL Server Error Messages - Msg 443 - Invalid use of 'UPDATE' within a function.

Error Message

Server: Msg 443, Level 16, State 2, Line 1
Invalid use of 'UPDATE' within a function.

Causes:

As the message suggests, you are not allowed to use the UPDATE statement inside a function unless the UPDATE statement is directed to a table variable local to the function.

To illustrate, here’s an example of a function that will generate the error:

CREATE FUNCTION [dbo].[ufn_GetTotalAmount]
( @OrderID    INT,
  @Amount     MONEY )
RETURNS MONEY
AS
BEGIN

DECLARE @TotalAmount    MONEY

SELECT @TotalAmount = [TotalAmount] + @Amount
FROM [dbo].[Orders]
WHERE [OrderID] = @OrderID

UPDATE [dbo].[Orders]
SET [TotalAmount] = @TotalAmount
WHERE [OrderID] = @OrderID

RETURN @TotalAmount

END

Since the UPDATE statement is directed to a table and not to a table variable local to the function, the following error is encountered:

Server: Msg 443, Level 16, State 1, Procedure ufn_GetTotalAmount, Line 14
Invalid use of 'UPDATE' within a function.

Solution / Work Around:

To avoid this error from happening, make sure that you don’t use an UPDATE statement inside a user-defined function unless it’s updating a local table variable. If you really need to use the UPDATE statement on a table, you have to use a stored procedure instead of a user-defined function for this purpose.

Here’s how the script shown above will look like using a stored procedure:

CREATE PROCEDURE [dbo].[usp_GetTotalAmount]
  @OrderID      INT,
  @Amount       MONEY,
  @TotalAmount  MONEY OUTPUT
AS

SELECT @TotalAmount = [TotalAmount] + @Amount
FROM [dbo].[Orders]
WHERE [OrderID] = @OrderID

UPDATE [dbo].[Orders]
SET [TotalAmount] = @TotalAmount
WHERE [OrderID] = @OrderID

Since a stored procedure can only return an integer value, the total amount needs to be returned as an output parameter because it is of money data type.

Related Articles :