Sql 存储过程:从表中选择数据;A「;并在表中插入数据“;B";
我已经很长时间没有涉及存储过程和函数了。 所以我决定为自己制作一个迷你训练数据库 目前,我正在尝试创建一个过程,该过程从一个表中选择数据(Test_trigger),并表示如果颜色的总和超过阈值,那么我将向另一个表写入一个警报行(Test_alm_trigger) 以下是我的2个表创建脚本: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
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行()我实际上没有行限制。我已经在基中指出了固定阈值,但我认为对于练习来说,在过程中声明一个变量更有趣