创建输入输出过程

时间:2013-11-17 13:05:13

标签: sql sql-server tsql

我有一个Transaction表,其中包含以下列:

PoojaDetailsID,
ReceiptNo - computed varchar(25) contains a combination of both characters and numbers,
ReceiptDate,
FirstName,
LastName,
TelNo and many other columns...

我想创建一个存储过程来在事务表中插入数据,并将插入记录的ReceiptNo捕获为Output参数。我正在使用ASP.net应用程序来存储数据。

请告知。

2 个答案:

答案 0 :(得分:0)

有很多事情可以说。希望这个例子足以满足你的需求。

CREATE PROCEDURE DoTheJob
    -- Add the parameters for the stored procedure here
    @Param1 varchar(10),
    @param2 varchar(20),
    @result  varchar(30) output
AS
BEGIN

    SET NOCOUNT ON;
    set @result='actually put the requred code di fill the result'

    insert into YourTable select from YourData 

END
GO

答案 1 :(得分:0)

CREATE Procedure usp_SomeName
    @PoojaDetailsID     INT         = NULL,
    @ReceiptNo          varchar(25) = NULL OUTPUT,
    @ReceiptDate        Datetime    = NULL,
    @FirstName          VARCHAR(50) = NULL,
    @LastName           VARCHAR(50) = NULL,
    @TelNo              VARCHAR(50) = NULL
AS
BEGIN
    SET NOCOUNT ON;

    BEGIN TRY
        IF @ReceiptNo IS NULL
             RAISERROR('Validation Failed: ReceiptNo name cannot be null', 16,1)

        IF EXISTS (SELECT ReceiptNo FROM dbo.TableName
                   WHERE ReceiptNo = @ReceiptNo)
              RAISERROR('Validation Failed: ReceiptNo Name already Exists',16,1)

        BEGIN TRANSACTION
          INSERT INTO TableName(Column1, Column2, Column3,....)
          VALUES (@Variable1, @Variable2, @Variable3,.... )

          COMMIT TRANSACTION

        SET @ReceiptNo =        ---<----- How ever you will determine the value of @ReceiptNo 
                                --<-----  if your user will pass the value then just set the variable
                                --<----   Then Just Using the The Key word "OUTPUT" will do the trick 
    END TRY

    BEGIN CATCH 
       IF (@@TRANCOUNT > 0)
         ROLLBACK TRAN

       SELECT @ReturnCode = ERROR_NUMBER(), @ReturnMessage = ERROR_MESSAGE()

      SELECT ERROR_NUMBER() AS ERRORNUMBER, 
             ERROR_MESSAGE() AS ReturnMessage,
             ERROR_LINE()   AS ErrorLine,
             ERROR_SEVERITY() AS ErrorSeverity,
             ERROR_STATE() AS ErrorState
    END CATCH

   SET NOCOUNT OFF;
END
GO

调用存储过程时,声明类型为@RtnReceiptNo varchar(25)的变量,并使用关键字OUTPUT将其传递给存储过程。

像这样......

DECLARE @RtnReceiptNo varchar(25) = '12BCkj12KK'

EXECUTE  usp_SomeName
     @PoojaDetailsID = 1,
     @ReceiptNo      = @RtnReceiptNo OUTPUT,
     @ReceiptDate    = 'SomeDate',
     @FirstName      = 'FistName',
     @LastName       = 'LastName',
     @TelNo          = '1465161516'

SELECT @RtnReceiptNo

修改

由于您的@ReceiptNo来自计算列,或者您需要在代码中执行一些额外步骤来捕获它。

使用数据类型为Table Variable的一列声明@ReceiptNo然后在您的插入语句中使用OUTPUT子句获取@ReceiptNo和INSERT INTO插入的表变量的值,然后SELECT从那里将它分配给存储过程的OUTPUT变量。

存储过程定义的其余部分保持不变只需更改INSERT语句,如下所示

DECLARE @tbl TABLE (Value VARCHAR(25))   --<--- Table variable to insert the @ReceiptNo values

INSERT INTO Table_Name (Column1, Column2, Column3, ....)
OUTPUT   inserted.ReceiptNo INTO @tbl              ---<---- Using OUTPUT and inserted Table retrieve 
VALUES (Value1, 'Value2',....)                         --the newly inserted ReceiptNo values and  
                                                       ---insert into your Table Variable 

SELECT @ReceiptNo = Value FROM @tbl                 --<--- Retrieve the value from table variable and
                                                      -- store it into the variable you will OUTPUT
                                                      -- from you stored procedure