2016-06-07 62 views
0

我需要学习如何在SQL Server 2014中构建一个将数据插入到表中的存储过程 - 但前提是满足条件。如果满足SQL Server存储过程的条件,将数据插入表中

我将使用一个基本的例子:

我有2个表,customersorders与在客户一个简单的一对多的关系。

Customers表包含:
客户ID,客户名称,TermStartDate,TermEndDate

Orders表包含:
包含订单ID,客户ID,产品ID,订购日期

我想我的存储过程使用参数CustomerID,ProductID,OrderDate在订单表中插入新记录

问:
不过,我只想插入记录,如果订购日期是客户的TermStartDate和TermEndDate

之间

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

+0

当条件未满足时,您的选项实质上是:忽略它,但不插入,引发错误消息,在某处记录尝试,或返回错误值,例如'-1';或以上的组合。 –

回答

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 

注意明确的事务隔离级别定义和条件,并插入包裹在交易中将确保并发呼叫不会互相干扰。

0

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

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

我不明白我在,如果条件不满足,可能会发生什么样的条件选项,例如记录没有被插入,并返回一个错误消息(?)

如果条件不符合,没有记录将被插入

我也想在存储过程来考虑是否其他用户当存储过程正在执行时,也会对底层数据进行更改(如果需要考虑)

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

相关问题