Sql 存储过程:从表中选择数据;A「;并在表中插入数据“;B";

Sql 存储过程:从表中选择数据;A「;并在表中插入数据“;B";,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我已经很长时间没有涉及存储过程和函数了。 所以我决定为自己制作一个迷你训练数据库 目前,我正在尝试创建一个过程,该过程从一个表中选择数据(Test_trigger),并表示如果颜色的总和超过阈值,那么我将向另一个表写入一个警报行(Test_alm_trigger) 以下是我的2个表创建脚本: create table Test_trigger ( id INT IDENTITY(1,1) PRIMARY KEY, Couleur VARCHAR(50), Horodate

我已经很长时间没有涉及存储过程和函数了。 所以我决定为自己制作一个迷你训练数据库

目前,我正在尝试创建一个过程,该过程从一个表中选择数据(Test_trigger),并表示如果颜色的总和超过阈值,那么我将向另一个表写入一个警报行(Test_alm_trigger)

以下是我的2个表创建脚本:

create table Test_trigger (
    id INT IDENTITY(1,1) PRIMARY KEY,
    Couleur VARCHAR(50),
    Horodate DATETIME,
    Nombre DECIMAL(6,2),
    Seuil_fixe INT
);

create table Test_alm_trigger (
    id_alm INT IDENTITY(1,1) PRIMARY KEY,
    Label VARCHAR(100),
    Horodate DATETIME,
    Seuil DECIMAL(6,2)
);
更准确地说,目标是:

当颜色([Couleur])如“Blue”)的[Nombre]列的总和高于输入的阈值([Seuil_fixe])时,程序运行并在Test_alm_触发器表中插入一行,其中包含[Label]、进行添加的日期(SYSDATETIME())和[Nombre]列的总和

我已经创建了这个程序,但我不确定它是如何工作的,或者它是否好

CREATE PROCEDURE ajoutL_triggerAlm
(
    @Couleur nvarchar(50),
    @Label nvarchar(200) = 'Dépassement de seuil',
    @Seuil float(4),
    @Seuil_fixe float(4),
    @Msg nvarchar(200)

)
AS
BEGIN
IF EXISTS (
    SELECT [Couleur] 
        FROM Test_trigger
        GROUP BY [Couleur], [Nombre], [Seuil_fixe]
        HAVING [Couleur] = @Couleur AND
                SUM([Nombre]) = @Seuil AND
                [Seuil_fixe] = @Seuil_fixe AND
                @Seuil > @Seuil_fixe
)
    BEGIN
        SET @Msg = 'Debug'
    END

ELSE
    BEGIN
        INSERT INTO Test_alm_trigger
        VALUES (@Label, SYSDATETIME(), @Seuil)
    END
END
如果你有任何答案,提示。。。我买了


提前谢谢你

我建议的主要改变是让你的程序集以程序为基础,而不是以程序为基础。关系数据库针对基于集合的操作进行了优化,因此您应该尝试自己以这种方式进行操作

我添加了其他最佳实践

CREATE PROCEDURE ajoutL_triggerAlm
(
    @Couleur nvarchar(50)
    , @Label nvarchar(200) = 'Dépassement de seuil'
    -- Almost never use float, its not a precise numeric amount and should only be used when specifically required
    , @Seuil decimal(8,4)
    -- Almost never use float, its not a precise numeric amount and should only be used when specifically required
    , @Seuil_fixe decimal(8,4)
    , @Msg nvarchar(200)
)
AS
BEGIN
    -- Best practice (I'll leave the meaning as an exercise)
    -- SQL Server recommendation is to ";" terminate all statements
    SET NOCOUNT, XACT_ABORT ON;

    -- Best practice, always list the columns you are inserting into
    -- Use set-based operations instead of procedural where you can
    INSERT INTO dbo.Test_alm_trigger (Label, Horodate, Seuil)
        SELECT @Label, SYSDATETIME(), @Seuil
        -- Question states when SUM([Nombre] above the threshold @Seuil_fixe - so I think this is the logic
        -- Although its not clear where the column Seuil_fixe comes into it
        WHERE (
            SELECT SUM([Nombre])
            FROM Test_trigger
            WHERE [Couleur] = @Couleur
        ) > @Seuil_fixe;

    -- Detect failure using @@ROWCOUNT
    SET @Msg = CASE WHEN @@ROWCOUNT = 0 THEN 'Debug' ELSE NULL END;

    -- Return a status, can use other values to indicate errors
    RETURN 0;
END;

您计划如何调用您的过程-这是您将从代理作业中执行的操作,还是您应该在更新后执行
触发器而不是过程?与参数
@Seuil\u fixe
相比,不清楚如何使用列
Seuil\u fixe
?您存储了一个阈值并传入了一个阈值?@Stu该过程必须自行触发,目前我只使用手动输入的数据和“exec”对其进行了测试。DaleK在我的桌子上,我确实存储了固定的阈值。例如,对于颜色“红色”,阈值为2450。如果红色的“Nombre”列中的每个值的总和大于2450,那么我想在表中插入一行,表示已经超过了这个阈值。反思一下,当我有一个列时,是否没有必要调用一个参数?@Brck那么Test_触发器中每种颜色有多少行?它似乎不止一个,因为你建议了一个求和,但如果你还存储了阈值,Seuil_fixe,那么,你可能会得到相同颜色的每行不同的值?真正能让这个问题清楚的是样本数据和预期结果,它们说明了所有用例,包括边缘用例。@DaleK在我进行本练习的训练时,我用这种插入方式手工编写数据:`插入测试触发器(Couleur、Horodate、Nombre、Seuil_fixe)值('Orange','2020-05-01 11:36:01',723.93,3000);插入测试触发器(Couleur、Horodate、Nombre、Seuil_fixe)值('Blue','2021-03-09 08:36:33',550.74,2500);…`我在一个站点上使用了大约100行()我实际上没有行限制。我已经在基中指出了固定阈值,但我认为对于练习来说,在过程中声明一个变量更有趣