Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

A nested INSERT, UPDATE, DELETE, or MERGE statement is not allowed in a SELECT statement

I would like to insert a record, then return the details of that record with a stored procedure:

USE 
TEST
GO

CREATE PROCEDURE AddProject(
    -- In
    @_title NVARCHAR(200),
    @_description NVARCHAR(MAX),
    -- Out
    @Title NVARCHAR(200) OUT,
    @Description NVARCHAR(MAX) OUT)
AS
BEGIN
    SELECT 
        [ProjectsTable.ProjectID], 
        [Title], 
        [Description]
    FROM 
        (INSERT INTO [Projects] ("Title", "Description")
         OUTPUT inserted.ProjectID
         VALUES (@_title, @_description)) ProjectsTable
END

I'm getting this error, what am I doing wrong?

Msg 10729, Level 15, State 1, Procedure AddProject, Line 31
A nested INSERT, UPDATE, DELETE, or MERGE statement is not allowed in a SELECT statement that is not the immediate source of rows for an INSERT statement.

Thanks to answer:


The Procedure ended up like this:

USE 
    TEST
GO
    CREATE PROCEDURE AddProject(   

        -- In    
        @_title NVARCHAR(200),
        @_description NVARCHAR(MAX),    
        -- Out    
        @ProjectID INT OUT,
        @Title NVARCHAR(200) OUT,
        @Description NVARCHAR(MAX) OUT

    )
    AS
    BEGIN    

        BEGIN TRAN  

            INSERT INTO     
                [Projects]    
                    ("Title", "Description")
                VALUES    
                    (@_title, @_description)                

            SET @ProjectID = SCOPE_IDENTITY();

            SELECT 
                @Title = [Title], 
                @Description = [Description]                
            FROM 
                [Projects] 
            WHERE 
                [Projects].[ProjectID] = @ProjectID         

        COMMIT

    END

And i called it like this:

Declare @ProjectID as INT
Declare @Title as NVARCHAR(200)
Declare @Description as NVARCHAR(MAX)

EXEC AddProject "Test project", "A test project", @ProjectID output, @Title output, @Description output

SELECT @ProjectID, @Title, @Description
like image 974
Jimmyt1988 Avatar asked Oct 19 '25 13:10

Jimmyt1988


1 Answers

Just take the latest inserted Identity to recover Title and Description from your table.

CREATE PROCEDURE AddProject(
    -- In
    @_title NVARCHAR(200),
    @_description NVARCHAR(MAX),
    -- Out
    @Title NVARCHAR(200) OUT,
    @Description NVARCHAR(MAX) OUT,
    @ProjectID INT OUT)
AS
BEGIN
    BEGIN TRAN
        INSERT INTO [Projects] (@_title, @_description);
        SET @ProjectID = SCOPE_INDENTITY();
        SELECT @Title = [Title], @Description = [Description] FROM [Projects] WHERE [Projects.ProjectID] = @ProjectID;
    COMMIT
END

Notice the new ProjectID OUT parameter

SCOPE_IDENTITY

like image 144
Hybris95 Avatar answered Oct 22 '25 05:10

Hybris95