TSQL使用当前插入的记录来选择另一个表中的数据

时间:2013-05-15 14:54:38

标签: sql-server-2008 tsql stored-procedures triggers scope-identity

TSQL很新......

我有下表名为“tblinit”:

Account_Num    UserID        Task_Percent
-----------    ------------  ------------
1              john.smith    0.75

我想更新下面“tblRaw”中的“任务百分比”值。

Account_Num    UserID        Task_Percent
-----------    ------------  ------------
1              john.smith    0.5
2              mary.mickle   0.9
3              don.donalds   1

我的计划是在插入“tblinit”时使用由触发器执行的TSQL存储过程。存储过程将数据移动到“tblRaw”(合并或删除和插入),然后在过程完成时截断“tblinit”。 tblInit仅用于暂存传入数据。

have read about SCOPE_IDENTITY@@IDENTIY但未完全掌握这一概念。范围是由执行存储过程的触发器定义的吗?在使用SCOPE_IDENTITY@@IDENTITY尝试我自己的SELECT语句时,我总是以“NULL”结果返回。引用的MSDN文章似乎返回了与文章示例中指定的数据无关的主键。显然,我正在读错误的东西。我想抓住刚刚插入的记录并在我的查询中使用它。

从本质上讲,如何在插入时自动更新john.smith的新百分比值,或者如何完全添加新记录?

2 个答案:

答案 0 :(得分:2)

  

如何在插入

上自动更新john.smith的新百分比值

此触发器可用于执行以下操作:

create trigger tblinit_to_tblRaw
on tblinit
for insert
as
begin
    update r
    set r.Task_Percent = i.Task_Percent
    from inserted i
        join tblRaw r on i.UserID = r.UserID -- Join on Account_Num instead?
end

这不考虑新记录(tblRaw中没有现有匹配)。为此,您可能希望运行if exists(...merge

答案 1 :(得分:1)

鉴于您提到的各种概念,我必须承认对您的意图有点困惑。

如果你想在更新/删除触发器触发后从原始表中删除,那么你做错了。

如果您只是出于性能原因想要在另一个表中保留一个运行总计,请查看“索引视图”。

如果要向一个表添加内容然后更新另一个表并从原始表中删除,那么您要么是在寻找队列,要么只是一个存储过程来在适当的表上执行更新。你不需要用触发器和东西做复杂的步骤。

不知道IDENTITY的来源在哪里。很确定你在这里不需要它。

我认为你使它变得比它需要的更复杂。

我可能错了 - 随意详细说明。