相关疑难解决方法(0)

检查是否存在行,否则插入

我需要编写一个T-SQL存储过程来更新表中的行.如果该行不存在,请插入它.所有这些步骤都由事务包装.

这是一个预订系统,所以它必须是原子和可靠的.如果交易已提交且预订航班,则必须返回true.

我是T-SQL的新手,不知道如何使用@@rowcount.这是我到现在为止所写的.我在正确的道路上吗?我确信这对你来说很容易.

-- BEGIN TRANSACTION (HOW TO DO?)

UPDATE Bookings
 SET TicketsBooked = TicketsBooked + @TicketsToBook
 WHERE FlightId = @Id AND TicketsMax < (TicketsBooked + @TicketsToBook)

-- Here I need to insert only if the row doesn't exists.
-- If the row exists but the condition TicketsMax is violated, I must not insert 
-- the row and return FALSE

IF @@ROWCOUNT = 0 
BEGIN

 INSERT INTO Bookings ... (omitted)

END

-- END TRANSACTION …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2008

226
推荐指数
5
解决办法
48万
查看次数

SQL Server IF NOT EXISTS用法?

好的,所以我的架构是这样的:

表:Timesheet_Hours

列:

  • Timesheet_Id(PK,int)
  • Staff_Id(int)
  • BookedHours(int)
  • Posted_Flag(布尔)

这是该表的极简化版本,但它将用于本说明的目的.假设一个人只能拥有一个时间表记录.

我要做的是将记录添加到另一个名为WorkLog的表中.这里的每条记录都有与之相关的时间.当该表更新时,我也想更新Timesheet_Hours.

在我更新Timesheet_Hours之前,我想首先检查相关的Timesheets是否尚未发布,然后我想检查是否实际上有一条记录要更新.

if语句的第一部分,检查时间表是否尚未发布,工作正常.问题是第二部分.检查它将要更新的记录已经存在.问题是它总是会引发错误.

注意:下面的代码是从WorkLog表上的update,insert和delete触发器运行的存储过程中提取的.@PersonID是该表的参数之一.如果我注释掉该语句的第二部分,存储过程可以正常工作.

IF EXISTS
    (
    SELECT 1
    FROM Timesheet_Hours
    WHERE Posted_Flag = 1
    AND Staff_Id = @PersonID
    )

    BEGIN
        RAISERROR('Timesheets have already been posted!', 16, 1)
        ROLLBACK TRAN
    END
ELSE
    IF NOT EXISTS
        (
        SELECT 1
        FROM Timesheet_Hours
        WHERE Staff_Id = @PersonID
        )

        BEGIN
            RAISERROR('Default list has not been loaded!', 16, 1)
            ROLLBACK TRAN
        END
Run Code Online (Sandbox Code Playgroud)

sql sql-server stored-procedures

44
推荐指数
1
解决办法
28万
查看次数