【发布时间】:2018-03-09 21:10:05
【问题描述】:
我有一个表 Conservation_Dev 包含这些列(其他 30 个):
-
I3_IDENTITY- 一个BIGINT和一个唯一键 -
STATE- 2 个字母的美国州缩写 -
ZONE- 当我想存储这条记录的时区时
我还有一张表TimeZoneCodes 将美国各州映射到时区(忘记一些州位于多个时区的事实):
-
state_code- 该州的 2 个字母缩写 -
time_zone- 带有时区(EST、CST 等)的文本
我在没有时区数据的情况下将数据加载到Conservation_Dev,这是我无法控制的。我想创建一个更新记录的插入后触发器。对以前的线程进行了一些研究,我得出了以下结论:
CREATE TRIGGER [dbo].[PopulateTimeZoneBasedOnUSState]
ON [dbo].[Conservation_Dev]
AFTER INSERT
AS
BEGIN
UPDATE [dbo].[Conservation_Dev]
SET [ZONE] = (SELECT [time_zone]
FROM [dbo].[TimeZoneCodes] Z
WHERE Z.[state_code] = i.[STATE])
FROM Inserted i
WHERE [I3_IDENTITY] = i.[I3_IDENTITY]
END
我得到一个错误,但是:
不明确的列名“I3_IDENTITY”
另外,这是正确的方法吗?如果通过 SSIS 导入包一次加载的数据是 5 或 10,000 条记录,这会是个问题吗?
【问题讨论】:
-
为什么不使用 SSIS 中的查找组件将时区添加为列,以便插入数据?触发器并不总是解决这个问题的最佳答案,因为它们对于以后维护代码的人来说不容易看到,数据似乎不知从何而来。
-
我无权访问 SSIS 包。我无法控制该过程。
-
我认为你是对的......
-
如果您担心每次插入时触发器的开销,为什么不从下面获取正确结果的 SQL 并将其放入过程中。编辑它以仅更新时区为空的行,然后您可以按计划在作业中运行该过程。这将减少在每一行上触发的触发器的开销,但这意味着插入后不会立即更新行。另请注意,如果您没有创建触发器的权限,您可能没有权限来创建过程和/或作业。
-
区域列的更新需要在插入记录时进行。由于不属于这个论坛的不同原因,我需要使用触发器。我无法改变其他任何事情。
标签: sql-server