2015-08-26 30 views
1

我正在与Sage Evolution合作,并为我们的公司定制大量后端工具。SQL Server:查询未根据需要运行

我需要写一个查询,当用户输入一个负数时,系统不允许交易,但是当用户输入一个负数并且产品属于“化学品”组时,它需要处理交易。

这是我写到目前为止的代码。

DECLARE 
    @iAfterfQuantity Int; 
    @iAfteriStockCodeID Int; 
    @iAfterStockItemGroup VarChar 

SELECT 
    @iAfterfQuantity = fQuantity, 
    @iAfteriStockCodeID = iStockCodeID 
FROM 
    INSERTED 

SELECT 
    @iAfterStockItemGroup = ItemGroup 
FROM 
    dbo.stkItem 
WHERE 
    StockLink = @iAfteriStockCodeID 

BEGIN 
    IF @iAfterfQuantity < 0 AND @iAfterStockItemGroup <> 'chemicals' 
    BEGIN 
     RAISERROR ('',16,1) 
     ROLLBACK TRANSACTION 
    END 
END 
+0

我可以在这里看到最大的缺陷就是你正在考虑的触发将用于执行每行 –

回答

1

这是一个更适合于检查约束然后是触发器的任务,特别是考虑到您提出错误的事实。

首先,创建检查功能:

CREATE FUNCTION fn_FunctionName 
(
    @iAfterfQuantity Int, 
    @iAfteriStockCodeID Int 
) 
RETURNS bit 
AS 
BEGIN 

DECLARE @iAfterStockItemGroup VarChar(150) -- Must specify length! 
SELECT @iAfterStockItemGroup = ItemGroup FROM dbo.stkItem WHERE [email protected] 

IF @iAfterfQuantity < 0 AND @iAfterStockItemGroup <> 'chemicals' 
    RETURN 0 

RETURN 1 -- will be executed only if the condition is false... 

END 

然后,改变你的表中添加检查约束:

ALTER TABLE YourTableName 
    ADD CONSTRAINT ck_ConstraintName 
    CHECK (dbo.fn_FunctionName(fQuantity, iStockCodeID) = 1) 
GO 
+0

我们不能改变表格 – Pooveshin

+0

你不能改变表格,但你可以添加一个触发器?这是奇怪的...... –

+0

这是进化的方式编码,我们不能改变表格,但正如你所说的添加触发器,这是我们通常为客户做什么,当我们需要访问客户报告等... – Pooveshin