Modify Database State Using User-defined Function

In this post we are going to Insert data using an UDF.  We all know that User-defined functions (UDF) cannot be used to perform that modify the database state.

Error Occur while Inserting using UDF:

Invalid use of the side-affecting operator ‘INSERT’ within a function.

Let’s get it done. First we need to create a database & a table to perform those operations.

Create a new Database:

CREATE TABLE [dbo].[Customer](
        [Id] [int] NOT NULL,
        [Name] [varchar](20) NOT NULL,
PRIMARY KEY CLUSTERED 
(
        [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

Create a SP:

--Exec Save_Customer 'Shashangka'
ALTER PROCEDURE[dbo].[Save_Customer]
(
           NVARCHAR(50)
)
AS
BEGIN
        BEGIN TRY
                 BEGIN TRANSACTION;
                         DECLARE  INT = 0
                         --====================================================----
                         EXEC  = funcSave_customer  
                         SELECT  as ReturnValue
                         --SELECT * FROM [dbo].[Employee]
                         --====================================================----
                 COMMIT TRANSACTION;
        END TRY
        BEGIN CATCH
                IF @ > 0
                ROLLBACK TRANSACTION;

                DECLARE  INT = ERROR_NUMBER();
                DECLARE  INT = ERROR_LINE();
                DECLARE  NVARCHAR(4000) = ERROR_MESSAGE();
                DECLARE  INT = ERROR_SEVERITY();
                DECLARE  INT = ERROR_STATE();
                --print ; print 
        END CATCH
END

Create UDF: Here we have dynamically build the query

SELECT @sql = '
                                        INSERT INTO [Customer] (ID, NAME) 
                                VALUES ('+CAST(@id as varchar)+' ,'''+CAST( as nvarchar)+''')
                                  ';

then used  system stored procedure to execute the statement.

EXECUTE sp_executesql @sql;

Finally the UDF

--exec funcSave_customer ''
ALTER FUNCTION [dbo].[funcSave_customer] 
(
         varchar(50)
)
RETURNS INT
AS
BEGIN
        --SET NOCOUNT ON;
        DECLARE @id INT  
        SET @id = ISNULL(((SELECT MAX(id) FROM Customer)+1),'1')
        DECLARE @sql nvarchar(4000); 
        SELECT @sql = '
                                        INSERT INTO [Customer] (ID, NAME) 
                                VALUES ('+CAST(@id as varchar)+' ,'''+CAST( as nvarchar)+''')
                                  ';
        EXECUTE sp_executesql @sql;  
        RETURN 1
END

Output:

Author:

Since March 2011, have 8+ years of professional experience on software development, currently working as Senior Software Engineer at s3 Innovate Pte Ltd.

Leave a Reply