SELECT 语句中不允许嵌套 INSERT、UPDATE、DELETE 或 MERGE 语句

2024-03-23

我想插入一条记录,然后使用存储过程返回该记录的详细信息:

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

我收到此错误,我做错了什么?

消息 10729,级别 15,状态 1,过程 AddProject,第 31 行
如果 SELECT 语句不是 INSERT 语句的直接行源,则不允许在 SELECT 语句中使用嵌套的 INSERT、UPDATE、DELETE 或 MERGE 语句。

感谢解答:


程序最终是这样的:

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

我这样称呼它:

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

只需获取最新插入的身份即可从表中恢复标题和描述。

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

注意新的 ProjectID OUT 参数

范围标识 https://stackoverflow.com/a/9477528/3635715

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SELECT 语句中不允许嵌套 INSERT、UPDATE、DELETE 或 MERGE 语句 的相关文章

随机推荐