2017-05-12 49 views
1

我想插入一条记录,然后用存储过程返回该记录的细节:嵌套的INSERT,UPDATE,DELETE或MERGE语句在SELECT语句是不允许

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行
嵌套INSERT,UPDATE,DELETE或MERGE语句未SELECT语句不是行的直接来源用于允许INSERT语句。

感谢回答:


的程序弄成这个样子:

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 
+0

什么是回归了,你正在传递同一数据的目的是什么? –

+0

首先插入,然后获取ID的SCOPE_IDENTITY(),然后返回Select语句。但我同意@ George2.0Hope。 –

+0

@ George2.0Hope - 注意来自INSERT的输出 – Jimmyt1988

回答

3

只取最新插入的Ide从你的表中恢复标题和描述。

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 

公告实施新专案编号OUT参数

SCOPE_IDENTITY

+0

哈,好点,我错过了那部分。怎么样使用OUTPUT关键字...这个问题是我可能需要的一个例子,但我可能需要使用INSERT的输出,因为我可能有多个插入 – Jimmyt1988

+0

您可以根据需要多次重复该事务,SCOPE_IDENTITY会在当前的环境中为您提供最新创建的身份。我会把文件链接到它(检查出来) – Hybris95

+0

谢谢你的家伙。备查。你知道如何使用OUTPUT关键字查询吗? – Jimmyt1988

0
CREATE PROCEDURE AddProject(
    -- In 
    @_title NVARCHAR(200), 
    @_description NVARCHAR(MAX), 
    -- Out 
    @Title NVARCHAR(200) OUT, 
    @Description NVARCHAR(MAX) OUT, 
    @ProjectID INT OUT, 
    @err INT OUT) 
AS 
BEGIN 
    BEGIN TRAN 
     INSERT INTO [Projects] (@_title, @_description); 
     SET @ProjectID = SCOPE_INDENTITY(); 
     SET @Title = (SELECT [Title] FROM [Projects] WHERE [Projects.ProjectID] = @ProjectID); 
     SET @Description = (SELECT [Description] FROM [Projects] WHERE [Projects.ProjectID] = @ProjectID); 
     SELECT @err = @@ERROR IF @err <> 0 BEGIN ROLLBACK TRANSACTION RETURN @err END 
    COMMIT 
END 
+0

我建议在发生错误时使用TRY CATCH块 – Hybris95

+0

@ Hybris95我想这取决于您是否想在DBA级别或代码级别处理错误,是的? –

+0

无论如何,如果发生错误,考虑到它只能是INSERT,它会自动ROLLBACKed,让错误发生并在应用程序级别管理 – Hybris95