我需要学习如何在SQL Server 2014中构建一个将数据插入表中的存储过程 - 但仅限于满足条件。
我将使用一个基本示例:
我有2个表,customers
和orders
,在CustomerID上有一对简单的一对多关系。
客户表包含:
CustomerID,CustomerName,TermStartDate,TermEndDate
订单表包含:
包含OrderID,CustomerID,ProductID,OrderDate
我希望我的存储过程使用参数CustomerID,ProductID,OrderDate
将新记录插入到orders表中 ASK:
但是,如果OrderDate位于客户的TermStartDate和TermEndDate之间,我只想插入记录
我显然是一个SQL存储过程的新手,如果条件不满足,我不明白我的选择,例如:未插入记录并返回错误消息(?)。我还希望存储过程考虑另一个用户是否也在执行存储过程时对基础数据进行更改(如果需要考虑)
答案 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将为您处理并发问题。