2017-03-17 89 views
0

我使用INSERT命令將一些值插入表中,然後我將它的插入值作爲OUTPUT。現在我想通過它的ID使用SELECT命令選擇插入的行我正在使用下面的代碼,但它似乎並沒有工作。在SQL Server存儲過程中選擇插入的行

CREATE PROCEDURE [dbo].[SP_UserRegistration] 
(
    @Name VARCHAR(100), 
    @Contact VARCHAR(20), 
    @DOB VARCHAR(20), 
    @MailAddress VARCHAR(500), 
) 
AS 
BEGIN 
    BEGIN TRY 

    DECLARE @id INT 

    INSERT INTO Customer (Name, Contact, DOB, MailAddress) 
    OUTPUT inserted.ID INTO @id 
    VALUES (@Name, @Contact, @DOB, @MailAddress) 

    SELECT * 
    FROM Customer 
    WHERE ID = @id 

    END TRY 
    BEGIN CATCH 
     PRINT('Error in SP_UserRegistration') 
    END CATCH 
END 
+0

你得到什麼輸出? –

+1

「似乎不起作用」是對問題的模糊描述。你有錯誤嗎?它不返回行嗎?如果ID不是'IDENTITY',那麼它將是NULL。調試的第一步是添加一個'PRINT @ id'。這只是基本的問題解決 –

+0

@ Nick.McDermaid值正在插入,但它不返回任何行 –

回答

2

您還可以使用的,而不是output parameterselect行返回到您的應用程序。

如果您Idsequence產生,使用next value for

create procedure [dbo].[usp_UserRegistration] (
    @Name varchar(100), 
    @Contact varchar(20), 
    @dob varchar(20), 
    @MailAddress varchar(500), 
    @Id int output 
) as 
begin; 
set nocount, xact_abort on; 
    begin try; 
    begin tran 
     /* your critiera for a new record here */ 
     select @Id = Id 
     from dbo.Customer with (updlock, serializable) 
     where Name = @Name 
      and dob = @dob; 
     if @@rowcount = 0 
     begin; 
     set @Id = next value for dbo.IdSequence /* with your Sequence name here */ 
     insert into dbo.Customer (Id, Name, Contact, dob, MailAddress) 
     values (@Id, @Name, @Contact, @dob, @MailAddress); 
     end; 
    commit tran; 
    end try 
    begin catch; 
    if @@trancount > 0 
     begin; 
     rollback transaction; 
     throw; 
     end; 
    end catch; 
go 

如果您Id是一個identity列,使用scope_identity()

There is a big difference between @@identity, scope_identity(), and ident_current()

參考文獻:

序列:

+0

只需確認** @ Id **和** @ id **相同​​,但只是在您的代碼片段中存在拼寫錯誤?即使我的主鍵不是身份認證,這也會成立嗎? –

+0

@IshanGupta是來自'sequence'的'Id'嗎? – SqlZim

相關問題