如果SQL Server存储过程满足条件,则将数据插入表中

时间:2016-06-07 08:56:22

标签: sql sql-server tsql stored-procedures sql-insert

我需要学习如何在SQL Server 2014中构建一个将数据插入表中的存储过程 - 但仅限于满足条件。

我将使用一个基本示例:

我有2个表,customersorders,在CustomerID上有一对简单的一对多关系。

客户表包含:
 CustomerID,CustomerName,TermStartDate,TermEndDate

订单表包含:
包含OrderID,CustomerID,ProductID,OrderDate

我希望我的存储过程使用参数CustomerID,ProductID,OrderDate

将新记录插入到orders表中

ASK:
但是,如果OrderDate位于客户的TermStartDate和TermEndDate之间,我只想插入记录

我显然是一个SQL存储过程的新手,如果条件不满足,我不明白我的选择,例如:未插入记录并返回错误消息(?)。我还希望存储过程考虑另一个用户是否也在执行存储过程时对基础数据进行更改(如果需要考虑)

2 个答案:

答案 0 :(得分:1)

如果未插入插入的标识值或-1的返回值,则可以使用以下定义创建存储过程:

CREATE PROCEDURE dbo.Orders_Insert
    @CustomerId INT,
    @ProductId INT,
    @OrderDate DATETIME2
AS
BEGIN

    SET NOCOUNT ON;

    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

    BEGIN TRAN;

    IF EXISTS ( SELECT  NULL
                FROM    Customers
                WHERE   CustomerId = @CustomerId AND
                        @OrderDate BETWEEN TermStartDate AND TermEndDate )
    BEGIN
        INSERT  INTO Orders
                (CustomerID,
                 ProductID,
                 OrderDate)
        SELECT  @CustomerId,
                @ProductId,
                @OrderDate;

        SELECT  SCOPE_IDENTITY();
    END;
    ELSE
    BEGIN
        SELECT  -1;
    END;

    COMMIT TRAN;
END;
GO

请注意显式事务隔离级别定义以及事务中包含的条件和插入将确保并发调用不会相互干扰。

答案 1 :(得分:0)

如果OrderDate位于客户的TermStartDate和TermEndDate之间,我只想插入记录

   create proc usp_orders   
    (
    @CustomerID int
    @ProductID int,
    @ OrderDate datetime
    )
    as
    begin
    if exists(select 1 from dbo.customers where customerid=@customerid and  @orderdate >= termstartdate and @orderdate<= termenddate)
    Begin
    Insert into Dbo.orders
    select @customerid,@productid,@orderdate 
    End
    End
  

如果条件不满足,我不明白我的选择,例如:未插入记录并返回错误消息(?)

如果不满足条件,则不会插入记录

  

我还希望存储过程考虑另一个用户是否也在执行存储过程时对基础数据进行更改(如果需要考虑)

当两个用户同时执行相同的过程时,SQL将为您处理并发问题。