Sql server 触发器';带标识光标的s[编辑]
大家早上好 这是我在这里的第一篇文章,我一直在为我的工作应用程序的数据库工作,我需要一些关于我的触发器的线索,这让我发疯 编辑: 鉴于下一个结构: 用户表:Sql server 触发器';带标识光标的s[编辑],sql-server,tsql,Sql Server,Tsql,大家早上好 这是我在这里的第一篇文章,我一直在为我的工作应用程序的数据库工作,我需要一些关于我的触发器的线索,这让我发疯 编辑: 鉴于下一个结构: 用户表: [dbo].[ENGIE_Users] ( [dbID] [int] IDENTITY(1,1) NOT NULL, [Nombre] [nvarchar](100) NOT NULL, [Apellidos] [nvarchar](200) NOT NULL, [HashContraseña] [binary](64) NOT NULL,
[dbo].[ENGIE_Users]
(
[dbID] [int] IDENTITY(1,1) NOT NULL,
[Nombre] [nvarchar](100) NOT NULL,
[Apellidos] [nvarchar](200) NOT NULL,
[HashContraseña] [binary](64) NOT NULL,
[Email] [nvarchar](150) NOT NULL,
[Direccion] [nvarchar](150) NOT NULL,
[Codigo Postal] [nvarchar](5) NOT NULL,
[Telefono] [nvarchar](12) NOT NULL,
[Venta a Nº Cliente] [nvarchar](10) NOT NULL,
[POS Asignado] [nvarchar](10) NOT NULL,
[User_Number] AS ([dbo].[EngieUsers]([dbID])),
[Salt] [uniqueidentifier] NULL
限制条件:
dbID主键
电子邮件无Pk唯一
这里是我们存储应用程序用户的地方
用户材料表:
[dbo].[ENGIE_User_Material]
(
[ID User] [int] NOT NULL,
[EAN] [nvarchar](13) NOT NULL,
[Product Number] [nvarchar](20) NOT NULL,
[Venta] [tinyint] NOT NULL,
[Cantidad Actual] [int] NOT NULL,
[Cantidad Total] [int] NOT NULL,
[Descripcion Corta] [nvarchar](100) NOT NULL,
[PVP Neto] [decimal](38, 20) NOT NULL,
[% DTO] [decimal](38, 20) NOT NULL,
主键ID用户+产品编号+EAN
ID user从用户引用dbID
此表用于存储每个用户分配到其“帐户”的产品数量
订单表:
[dbo].[ENGIE_Ended_Orders]
(
[dbID] [int] IDENTITY(1,1) NOT NULL,
[ID User] [int] NOT NULL,
[Procesado] [tinyint] NOT NULL,
[Finalizado] [tinyint] NOT NULL,
[Fecha de realizacion] [date] NOT NULL,
[OT] [nvarchar](20) NOT NULL,
[Order Id] AS ([dbo].[EngiePedidos]([dbID])),
[Total Pedido] [decimal](38, 20) NULL,
主键dbID
ID用户外键引用来自用户的dbId
此表将包含订单的“标题”
ALTER TRIGGER [dbo].[Qty_Restriction_4]
ON [ENGIE].[dbo].[ENGIE_Order_Content]
INSTEAD OF UPDATE
AS
DECLARE @cantAnt int
DECLARE @cantAct int
DECLARE @cant int
DECLARE @pvpsdto decimal(38,20)
DECLARE @dto decimal(38,20)
DECLARE @bool bit
DECLARE @total decimal(38,20)
SET @bool = 0;
SET @cant = (SELECT [Cantidad] FROM INSERTED)
SET @userId = (SELECT [ID User] FROM [ENGIE].[dbo].[ENGIE_Orders] WHERE [dbID] = (SELECT [Numero_Pedido] FROM INSERTED))
SET @cantAnt = (SELECT [Cantidad Total] FROM [ENGIE].[dbo].[ENGIE_User_Material] WHERE [ID User] = @userId AND [Product Number] = (SELECT [Product Number] FROM INSERTED))
SET @cantAct = (SELECT [Cantidad Actual] FROM [ENGIE].[dbo].[ENGIE_User_Material] WHERE [ID User] = @userId AND [Product Number] = (SELECT [Product Number] FROM INSERTED))
SET @pvpsdto = (SELECT [PVP Neto] FROM [ENGIE].[dbo].[ENGIE_User_Material] WHERE [Product Number] = (SELECT [Product Number] FROM INSERTED) AND [ID User] = (SELECT [ID User] FROM INSERTED))
SET @dto = (SELECT [% DTO] FROM [ENGIE].[dbo].[ENGIE_User_Material] WHERE [Product Number] = (SELECT [Product Number] FROM INSERTED) AND [ID User] = (SELECT [ID User] FROM INSERTED))
SET @total = (SELECT [Total Pedido] FROM [ENGIE].[dbo].[ENGIE_Orders] WHERE [dbID] = (SELECT [Numero_Pedido] FROM INSERTED))
IF(@total IS NULL)
BEGIN
SET @total = 0.0
END
BEGIN
SET NOCOUNT ON;
IF UPDATE([Cantidad])
BEGIN
IF((@cantAct+@cant) > @cantAnt)
BEGIN
RAISERROR('La Cantidad Actual no debe superar la Cantidad Total',18,1);
--->ROLLBACK TRANSACTION;
END
ELSE BEGIN
UPDATE ENGIE.dbo.ENGIE_Order_Content SET [Cantidad] = (SELECT [Cantidad] FROM inserted) WHERE [Numero_Pedido]= (SELECT [Numero_Pedido] FROM INSERTED) AND [Product Number]= (SELECT [Product Number] FROM INSERTED)
SET @bool = 1;
END;
END;
IF UPDATE([Procesado])
BEGIN
UPDATE ENGIE.dbo.ENGIE_Order_Content SET [Procesado] = (SELECT [Procesado] FROM inserted) WHERE [Numero_Pedido]= (SELECT [Numero_Pedido] FROM INSERTED) AND [Product Number]= (SELECT [Product Number] FROM INSERTED)
END;
IF UPDATE([Finalizado])
BEGIN
UPDATE ENGIE.dbo.ENGIE_Order_Content SET [Finalizado] = (SELECT [Finalizado] FROM inserted) WHERE [Numero_Pedido]= (SELECT [Numero_Pedido] FROM INSERTED) AND [Product Number]= (SELECT [Product Number] FROM INSERTED)
END;
IF UPDATE([ID Pedido])
BEGIN
UPDATE ENGIE.dbo.ENGIE_Order_Content SET [ID Pedido] = (SELECT [ID Pedido] FROM inserted) WHERE [Numero_Pedido]= (SELECT [Numero_Pedido] FROM INSERTED) AND [Product Number]= (SELECT [Product Number] FROM INSERTED)
END;
---> AQUI METER LO DEL AFTER UPDATE, PARA QUE NO HAYA PROBLEMA, CON UN BOOLEAN
IF (@bool = 1)
BEGIN
SET NOCOUNT ON;
UPDATE [ENGIE].[dbo].[ENGIE_Orders] SET [Total Pedido] = (@total+(@cant*(@pvpsdto-((@pvpsdto*@dto)/100)))) WHERE [dbID] = (SELECT [Numero_Pedido] FROM INSERTED)
END;
END
订单内容表
[dbo].[ENGIE_Order_Content]
(
[Order Id] [int] NOT NULL,
[Product Number] [nchar](20) NOT NULL,
[Procesado] [tinyint] NOT NULL,
[Finalizado] [tinyint] NOT NULL,
[Fecha de realizacion] [date] NOT NULL,
[Cantidad] [int] NOT NULL,
[ID Pedido] [nchar](8) NULL,
主键产品编号+订单Id
外键订单Id引用订单dbID
因此,考虑到这种结构,我需要的是下一个限制:
关于用户材料:
它自身的实际数量永远不必超过总量。(插入/更新)
关于订单内容:
插入或更新订单时,必须满足上述限制(因此,如果您要求5台,您必须有5台可供购买的产品)
此外,在插入/更新/删除时,触发器必须计算公式中的“订单总额”(数量*(价格-(价格*100/折扣)))
奉命:
因此还有两个表(与订单/订单内容结构相同,称为End Orders/End Order Con Content),当布尔值[Finalizado]为1时,此表将把这些表的所有行转移到其他两个表。并将恢复与此结束订单中的项目用户关联的实际数量
已完成的工作:
触发因素:
关于用户资料
ALTER TRIGGER [dbo].[Qty_Restriction]
ON [ENGIE].[dbo].[ENGIE_User_Material]
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
IF(SELECT [Cantidad Actual] FROM INSERTED) > (SELECT [Cantidad Total] FROM INSERTED)
BEGIN
RAISERROR('La Cantidad Actual no debe superar la Cantidad Total',18,1);
END
ELSE BEGIN
INSERT INTO ENGIE.dbo.ENGIE_User_Material SELECT [ID User],[EAN], [Product Number],[Venta],[Cantidad Actual],[Cantidad Total],[Descripcion Corta], [PVP Neto],[% DTO] FROM INSERTED;
END
END
这不允许您插入实际数量大于总数量的reg
ALTER TRIGGER [dbo].[Qty_Restriction_2]
ON [ENGIE].[dbo].[ENGIE_User_Material]
INSTEAD OF UPDATE
AS
DECLARE @material varchar(13)
DECLARE @pno varchar(20)
DECLARE @usuario int
SET @material = (SELECT [EAN] FROM INSERTED)
SET @pno = (SELECT [Product Number] FROM INSERTED)
SET @usuario = (SELECT [ID User] FROM INSERTED)
BEGIN
SET NOCOUNT ON;
IF UPDATE([Cantidad Actual])
BEGIN
IF(SELECT [Cantidad Actual] FROM INSERTED) > (SELECT [Cantidad Total] FROM INSERTED)
BEGIN
RAISERROR('La Cantidad Actual no debe superar la Cantidad Total',18,1);
END
ELSE BEGIN
UPDATE [ENGIE].[dbo].[ENGIE_User_Material] SET [Cantidad Actual] = (SELECT [Cantidad Actual] FROM INSERTED) WHERE [Product Number] = @pno AND [EAN] = @material AND [ID User] = @usuario
END
END
IF UPDATE([Cantidad Total])
BEGIN
IF(SELECT [Cantidad Actual] FROM INSERTED) > (SELECT [Cantidad Total] FROM INSERTED)
BEGIN
RAISERROR('La Cantidad Actual no debe superar la Cantidad Total',18,1);
END
ELSE BEGIN
UPDATE [ENGIE].[dbo].[ENGIE_User_Material] SET [Cantidad Total] = (SELECT [Cantidad Total] FROM INSERTED) WHERE [Product Number] = @pno AND [EAN] = @material AND [ID User] = @usuario
END
END
IF UPDATE([Venta])
BEGIN
UPDATE [ENGIE].[dbo].[ENGIE_User_Material] SET [Venta] = (SELECT [Venta] FROM INSERTED) WHERE [Product Number] = @pno AND [EAN] = @material AND [ID User] = @usuario
END
IF UPDATE([Descripcion Corta])
BEGIN
UPDATE [ENGIE].[dbo].[ENGIE_User_Material] SET [Descripcion Corta] = (SELECT [Descripcion Corta] FROM INSERTED) WHERE [Product Number] = @pno AND [EAN] = @material AND [ID User] = @usuario
END
IF UPDATE([PVP Neto])
BEGIN
UPDATE [ENGIE].[dbo].[ENGIE_User_Material] SET [PVP Neto] = (SELECT [PVP Neto] FROM INSERTED) WHERE [Product Number] = @pno AND [EAN] = @material AND [ID User] = @usuario
END
IF UPDATE([% DTO])
BEGIN
UPDATE [ENGIE].[dbo].[ENGIE_User_Material] SET [% DTO] = (SELECT [% DTO] FROM INSERTED) WHERE [Product Number] = @pno AND [EAN] = @material AND [ID User] = @usuario
END
END
这一个相同,但有更新
奉命:
CREATE TRIGGER [dbo].[TransferenceOrders_Inner]
ON [ENGIE].[dbo].[ENGIE_Orders]
AFTER UPDATE
AS
DECLARE @material nvarchar(20)
DECLARE @cant int
DECLARE @cantant int
DECLARE @usr int
DECLARE CURSOR_CANTIDAD CURSOR FOR
SELECT [Cantidad],[Product Number],[ID User] FROM [ENGIE].[dbo].[ENGIE_Order_Content] A, INSERTED I WHERE A.[Numero_Pedido] = I.Numero_Pedido
BEGIN
SET NOCOUNT ON;
IF UPDATE([Finalizado])
BEGIN
UPDATE A SET [Finalizado] = I.Finalizado FROM [ENGIE].[dbo].[ENGIE_Orders] A INNER JOIN INSERTED I ON A.dbID = I.dbID;
INSERT INTO [ENGIE].dbo.[ENGIE_Ended_Orders] ([Numero_Pedido],[ID User],[Fecha de realizacion],[OT],[ID Pedido],[Total Pedido])
(SELECT [dbID],[ID User],[Fecha de realizacion],[OT],[Numero_Pedido],[Total Pedido] FROM INSERTED)
INSERT INTO [ENGIE].dbo.[ENGIE_Ended_Order_Content] ([Numero_Pedido],[Product Number],[Fecha de realizacion],[Cantidad],[ID Pedido])
(SELECT [Numero_Pedido],[Product Number],[Fecha de realizacion],[Cantidad],[ID Pedido] FROM [ENGIE].[dbo].[ENGIE_Order_Content] A INNER JOIN INSERTED I ON A.Numero_Pedido = I.dbID)
OPEN CURSOR_CANTIDAD
FETCH CURSOR_CANTIDAD INTO @cant,@material,@usr
WHILE (@@FETCH_STATUS = 0)
BEGIN
UPDATE ENGIE.dbo.ENGIE_User_Material SET [Cantidad Actual] = (SELECT [Cantidad Actual] FROM ENGIE.dbo.ENGIE_User_Material A,INSERTED I WHERE A.[Product Number] = (SELECT [Product Number] FROM ENGIE.dbo.[ENGIE_Order_Content] B,INSERTED C WHERE B.Numero_Pedido = C.dbID)
AND A.[ID User] = I.[ID User])-@cant WHERE [Product Number] = @material AND [ID User] = @usr)
FETCH CURSOR_CANTIDAD INTO @cant,@material,@usr
END
CLOSE CURSOR_CANTIDAD;
DELETE A FROM [ENGIE].[dbo].[ENGIE_Orders] A INNER JOIN INSERTED I ON I.[dbID] = A.[dbID] AND A.[ID User] = I.[ID User];
END
DEALLOCATE CURSOR_CANTIDAD;
END
这个触发器需要游标,因为它必须补充刚刚处理的订单内容的数量
关于订单内容:
ALTER TRIGGER [dbo].[AutoIDOrder_DEL]
ON [ENGIE].[dbo].[ENGIE_Order_Content]
AFTER DELETE
AS
DECLARE @numped int
DECLARE @prod nchar(20)
DECLARE @pvp decimal(38,20)
DECLARE @pvpsdto decimal(38,20)
DECLARE @dto decimal(38,20)
DECLARE @cantidad int
SET @numped = (SELECT Numero_Pedido FROM INSERTED)
SET @prod = (SELECT [Product Number] FROM INSERTED)
SET @cantidad = (SELECT [Cantidad] FROM INSERTED)
SET @pvp = (SELECT [Total Pedido] FROM [ENGIE].[dbo].[ENGIE_Orders] WHERE [dbID] = @numped)
BEGIN
SET NOCOUNT ON;
SET @pvpsdto = (SELECT [PVP Neto] FROM [ENGIE].[dbo].[ENGIE_User_Material] WHERE [Product Number] = @prod)
SET @dto = (SELECT [% DTO] FROM [ENGIE].[dbo].[ENGIE_User_Material] WHERE [Product Number] = @prod)
UPDATE [ENGIE].[dbo].[ENGIE_Orders] SET [Total Pedido] = @pvp-(@cantidad*((@pvpsdto*100)/@dto)) WHERE [dbID] = @numped
END
当您从订单内容中删除注册表时,此项将从订单中更新“订单总数”
ALTER TRIGGER [dbo].[Qty_Restriction_3]
ON [ENGIE].[dbo].[ENGIE_Order_Content]
INSTEAD OF INSERT
AS
DECLARE @cantAnt int
DECLARE @cantAct int
DECLARE @cant int
DECLARE @pvpsdto decimal(38,20)
DECLARE @dto decimal(38,20)
DECLARE @total decimal(38,20)
SET @cant = (SELECT [Cantidad] FROM INSERTED)
SET @cantAnt = (SELECT [Cantidad Total] FROM [ENGIE].[dbo].[ENGIE_User_Material] WHERE [Product Number] = (SELECT [Product Number] FROM INSERTED) AND [ID User] = (SELECT [ID User] FROM INSERTED))
SET @cantAct = (SELECT [Cantidad Actual] FROM [ENGIE].[dbo].[ENGIE_User_Material]WHERE [Product Number] = (SELECT [Product Number] FROM INSERTED) AND [ID User] = (SELECT [ID User] FROM INSERTED))
SET @pvpsdto = (SELECT [PVP Neto] FROM [ENGIE].[dbo].[ENGIE_User_Material] WHERE [Product Number] = (SELECT [Product Number] FROM INSERTED) AND [ID User] = (SELECT [ID User] FROM INSERTED))
SET @dto = (SELECT [% DTO] FROM [ENGIE].[dbo].[ENGIE_User_Material] WHERE [Product Number] = (SELECT [Product Number] FROM INSERTED) AND [ID User] = (SELECT [ID User] FROM INSERTED))
SET @total = (SELECT [Total Pedido] FROM [ENGIE].[dbo].[ENGIE_Orders] WHERE [dbID] = (SELECT [Numero_Pedido] FROM INSERTED))
IF(@total IS NULL)
BEGIN
SET @total = 0.0
END
BEGIN
SET NOCOUNT ON;
BEGIN
IF((@cantAct+@cant) > @cantAnt)
BEGIN
RAISERROR('La Cantidad Actual no debe superar la Cantidad Total',18,1);
END
ELSE BEGIN
INSERT INTO ENGIE.dbo.ENGIE_Order_Content SELECT * FROM INSERTED;
UPDATE [ENGIE].[dbo].[ENGIE_Order_Content] SET [ID Pedido] = (SELECT [Numero_Pedido] FROM [ENGIE].[dbo].[ENGIE_Orders] WHERE [dbID] LIKE (SELECT [Numero_Pedido] FROM INSERTED)) WHERE [Numero_Pedido] LIKE (SELECT [Numero_Pedido] FROM INSERTED) AND [Product Number] LIKE (SELECT [Product Number] FROM INSERTED);
UPDATE [ENGIE].[dbo].[ENGIE_Order_Content] SET [Fecha de realizacion] = (SELECT [Fecha de realizacion] FROM [ENGIE].[dbo].[ENGIE_Orders] WHERE [dbID] = (SELECT [Numero_Pedido] FROM INSERTED)) WHERE [Numero_Pedido] LIKE (SELECT [Numero_Pedido] FROM INSERTED) AND [Product Number] LIKE (SELECT [Product Number] FROM INSERTED);
----> AUQUI CALCULO DE TOTAL
UPDATE [ENGIE].[dbo].[ENGIE_Orders] SET [Total Pedido] = (@total+(@cant*(@pvpsdto-((@pvpsdto*@dto)/100)))) WHERE [dbID] = (SELECT [Numero_Pedido] FROM INSERTED)
END
END
END
这将避免在订单内容中插入不符合要求的数量(实际数量您触发的触发器不处理多行插入。如果
SET @usuario = (SELECT [ID User] FROM INSERTED)
返回多个值。它将失败。触发器中的游标是非常糟糕的事情。您应该使用基于集合的方法重新编写触发器
你的前4个陈述应该重写
UPDATE A
SET [Finalizado] = i.Finalizado
FROM [ENGIE].[dbo].[ENGIE_Orders] A
INNER JOIN INSERTED I ON a.dbID = i.dbid;
INSERT INTO [ENGIE].dbo.[ENGIE_Ended_Orders] (
[Numero_Pedido]
,[ID User]
,[Fecha de realizacion]
,[OT]
,[ID Pedido]
)
SELECT [dbID]
,[ID User]
,[Fecha de realizacion]
,[OT]
,[Numero_Pedido]
FROM [ENGIE].[dbo].[ENGIE_Orders]
FROM inserted
INSERT INTO [ENGIE].dbo.[ENGIE_Ended_Order_Content] (
[Numero_Pedido]
,[Product Number]
,[Fecha de realizacion]
,[Cantidad]
,[ID Pedido]
)
SELECT [Numero_Pedido]
,[Product Number]
,[Fecha de realizacion]
,[Cantidad]
,[ID Pedido]
FROM [ENGIE].[dbo].[ENGIE_Order_Content] A
INNER JOIN INSERTED I ON A.Numero_Pedido = I.Dbid
DELETE A
FROM [ENGIE].[dbo].[ENGIE_Orders] A
INNER JOIN INSERTED I ON
WHERE I.[dbID] = A.DBID
AND A.[ID User] = I.USERID;
我不确定我是否符合您的条件(特别是连接,请检查一下),但触发器应该用基于集合的逻辑重写,我希望光标也可以被删除您的触发器不能处理多行插入。如果
SET @usuario = (SELECT [ID User] FROM INSERTED)
返回多个值。它将失败。触发器中的游标是非常糟糕的事情。您应该使用基于集合的方法重新编写触发器
你的前4个陈述应该重写
UPDATE A
SET [Finalizado] = i.Finalizado
FROM [ENGIE].[dbo].[ENGIE_Orders] A
INNER JOIN INSERTED I ON a.dbID = i.dbid;
INSERT INTO [ENGIE].dbo.[ENGIE_Ended_Orders] (
[Numero_Pedido]
,[ID User]
,[Fecha de realizacion]
,[OT]
,[ID Pedido]
)
SELECT [dbID]
,[ID User]
,[Fecha de realizacion]
,[OT]
,[Numero_Pedido]
FROM [ENGIE].[dbo].[ENGIE_Orders]
FROM inserted
INSERT INTO [ENGIE].dbo.[ENGIE_Ended_Order_Content] (
[Numero_Pedido]
,[Product Number]
,[Fecha de realizacion]
,[Cantidad]
,[ID Pedido]
)
SELECT [Numero_Pedido]
,[Product Number]
,[Fecha de realizacion]
,[Cantidad]
,[ID Pedido]
FROM [ENGIE].[dbo].[ENGIE_Order_Content] A
INNER JOIN INSERTED I ON A.Numero_Pedido = I.Dbid
DELETE A
FROM [ENGIE].[dbo].[ENGIE_Orders] A
INNER JOIN INSERTED I ON
WHERE I.[dbID] = A.DBID
AND A.[ID User] = I.USERID;
我不确定我是否符合你的标准(尤其是连接,请检查一下)但是触发器应该用基于集合的逻辑重写,我希望光标也能被删除写一个存储过程你使用的是
sql server
还是plsql
?请删除不相关的标记。完成了,它的tsql没有plsql。@BorisPomarol,第二个编辑约束不能用于此。我认为你需要插入或更新如果[actual quantity]写入存储过程,则列将使用sql server
或plsql
?请删除不相关的标记。完成,其tsql no plsql。@BorisPomarol,第二个编辑约束不能用于此操作。如果[actual quantity],则需要插入或更新列早上好,如果我希望在自己的表中有一个触发器,它不允许更新实际数量,除非它小于或等于总量,我将如何使用算术运算?不能使用:而不是更新…因为…….如果从插入中选择[Cantidad Actual]>选择[Cantidad Total]从INSERTED开始,BEGIN->RAISE ERROR END ELSE BEGIN->执行UPDATE END我怎么能绕过这个问题?@BorisPomarol,你能为这个列添加一个约束条件吗?在Dynamics NAV中使用C/AL到纯T-SQL的过渡在某些方面让我感到痛苦,核心是我不理解我能做的所有事情的期望使用T-SQL。所以,是的,我可以在这里设置一个约束。然后我应该设置2,一个用于实际数量,另一个用于总量,对吗?以及如何告诉约束根据其自身限制另一个字段的值?(有点混乱)。谢谢,@BorisPomarol,这样你就只能有纯tsql无障碍程序了,对吗?你能用新的要求更新问题吗?在列中留下约束,因为如果满足一定数量的要求,你的要求是更新的。纯T-SQL是的,我让它在主要问题中添加。但如果是通过约束,我们更容易接近,我们会今天早上,如果我想在自己的表中添加一个触发器,除非它小于或等于总数量,否则不允许更新实际数量,那么我将如何使用算术运算?不能使用:而不是更新…作为……。如果从插入中选择[Cantidad Actual]并选择[Cantidad Total]从INSERTED开始,BEGIN->RAISE ERROR END ELSE BEGIN->执行UPDATE END我怎么能绕过这个问题?@BorisPomarol,你能为这个列添加一个约束条件吗?在Dynamics NAV中使用C/AL到纯T-SQL的过渡在某些方面让我感到痛苦,核心是我不理解我能做的所有事情的期望使用T-SQL。所以,是的,我可以在这里设置一个约束。然后我应该设置2,一个用于实际数量,另一个用于总量,对吗?您如何告诉约束根据其自身限制另一个字段的值