【发布时间】:2019-12-16 01:17:21
【问题描述】:
我有一个 SQL Server 数据库,其中包含来自 ASP.NET C# 程序的术语作为此存储过程的单词列表:
CREATE PROCEDURE [dbo].[InsertTerms]
(@dt AS dbo.EngTerms READONLY)
AS
BEGIN
DECLARE @AllDocs FLOAT, @DocsWithText FLOAT,
@TF FLOAT, @IDF FLOAT, @Weight FLOAT, @Index_ID INT;
SET NOCOUNT ON;
INSERT INTO dbo.EnIndex (Term, TF, IDF, Weight, Doc_ID)
SELECT Term, TF, IDF, Weight, Doc_ID
FROM @dt;
插入这些术语后,我需要通过触发器为它们中的每一个计算IDF 和Weight,该触发器使用公式更新每个插入的行并更新行。
直到现在我才得到这个只更新最后一行:
ALTER TRIGGER [dbo].[UpdateIndex]
ON [dbo].[EnIndex]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @AllDocs FLOAT, @DocsWithText FLOAT,
@TF FLOAT, @IDF FLOAT, @Weight FLOAT, @Index_ID INT;
SET @Index_ID = (SELECT IDENT_CURRENT ('EnIndex'));
SET @AllDocs = (SELECT COUNT(Doc_ID) AS AllDocs FROM Document);
SET @DocsWithText = (SELECT COUNT(Distinct(Doc_ID)) FROM EnIndex WHERE Index_ID = @Index_ID);
SET @TF = (SELECT DISTINCT TF FROM EnIndex WHERE Index_ID = @Index_ID);
SET @IDF = (LOG(@AllDocs / @DocsWithText));
SET @Weight = (@TF * @IDF);
UPDATE EnIndex
SET IDF = @IDF, Weight = @Weight
WHERE Index_ID = @Index_ID;
END
任何建议,我都阅读了有关 stackoverflow 的所有问题,它们对完成这一步非常有帮助。
【问题讨论】:
-
您必须使用
inserted伪表,然后使用游标(或临时表循环)一次处理每一行 1。它不是推荐的做法,因为它在 SQL Server 中表现不佳 - 它在客户端中做得更好。但如果你不得不这样做。例如stackoverflow.com/questions/5805413/… -
你似乎还有一个额外的
Index_ID = @Index_ID似乎没有做任何事情? -
我修复了它,我之前看到了链接,但它不起作用
-
“没用”是什么意思?您必须以某种方式遍历行,这是一个好的开始,然后根据您的需要进行调整。从简单开始,构建一个循环,它只打印行中的详细信息并从那里开始工作。
-
为什么需要触发器?如果该过程可以手动运行,则创建一个返回结果的存储过程
标签: sql-server stored-procedures triggers