我有个股票计划。我只想在地点之间转乘。例如,来自A loc。到B位置5台计算机发送,但在A地没有计算机。我想在页面上显示一条消息:“没有可以传输的设备。现在,当我在SQL上A位置传输它时:-5台计算机,B位置显示5台计算机。我无法阻止它。”
我正在尝试这样的方法:
Create Proc Deneme4
(@StockID NVARCHAR(100)=NULL,
@FROM NVARCHAR(60)=NULL,
@TO NVARCHAR(60)=NULL,
@CNT integer= NULL)
AS
BEGIN
DECLARE @HasExist integer
Select @HasExist = COUNT(1) from STOK_TABLO Where URUNID=@StockID and LOKASYONID=@FROM
IF( @CNT != 0 and @FROM != '' )
BEGIN
UPDATE STOK_TABLO SET ADET=ADET-@CNT WHERE URUNID=@StockID AND LOKASYONID=@FROM
UPDATE STOK_TABLO SET ADET=ADET+@CNT WHERE URUNID=@StockID AND LOKASYONID=@TO
END
ELSE
print 'COUNT is 0 there is no possibility to transfer!'
ENDSTOCKID MODELID LOCATIONID COUNT
DS6878HD DS6878HD CCR 0
DS6878HD DS6878HD CPM 45那也是我的数据库。如果计数等于0,我想阻止它。而且我也不想看到一个小于0的计数。
我正在使用SQL server 2012。
发布于 2022-09-22 12:39:00
您似乎想先总结一下ADET的现有值。从逻辑上讲,您还需要检查新值是否低于0。
也是
PRINT消息,这些消息主要用于调试。相反,使用THROWSELECTUPDLOCK锁定提示也希望SET XACT_ABORT ON确保事务被清除。中允许空似乎毫无意义。
CREATE OR ALTER PROC Deneme4
@StockID NVARCHAR(100),
@FROM NVARCHAR(60),
@TO NVARCHAR(60),
@CNT integer
AS
SET NOCOUNT, XACT_ABORT ON;
BEGIN TRAN;
IF( ISNULL(
(
SELECT SUM(ADET)
FROM STOK_TABLO WITH (UPDLOCK)
WHERE URUNID = @StockID
AND LOKASYONID = @FROM
), 0) - @CNT < 0
)
BEGIN
THROW 50001, N'COUNT is too low, not possible to transfer!', 0;
END;
UPDATE STOK_TABLO
SET ADET += CASE WHEN LOKASYONID = @FROM THEN @CNT ELSE -@CNT END
WHERE URUNID = @StockID
AND LOKASYONID IN (@FROM, @TO);
IF @@ROWCOUNT <> 2
THROW 50002, N'Less than 2 rows affected!', 0;
COMMIT;https://stackoverflow.com/questions/73814557
复制相似问题