更新至原始问题:
对我正在做的事情提供一些见解。我在此表中有一个标有[Staging].[HRIS_EEMaster]
的表格,其中包含员工信息,公司状态等信息。我使用他们的个人ID号码作为密钥[PersNo]
。我有一个我们最近添加的专栏,如果员工终止是自愿或非自愿[Vol_Invol]
则显示。似乎在某些时候,人力资源代表不小心,错过了将这个价值添加到4名员工。我试图回到源来纠正这些信息,但是已经过了太多时间,我现在无法编辑数据。
我想要做的是使用[Vol_Invol]
作为密钥更新4名员工的[PersNo]
字段。我需要一个更新脚本来查看[Staging].[HRIS_EEMaster]
,找到4名员工的[PersNo]
,然后用“自愿”更新空白[Vol_Invol]
字段(这4个都是自愿条款) 。每位员工都有一个独特的[PersNo]
。
我将此脚本添加到现有的SSIS包中。这个SSIS包每月运行一次。临时表被截断,然后加载新数据。还有第二个包含SCD的包,它提供用于报告的主表。
我想将UPDATE脚本添加到SQL任务中,以便每次拉取数据时它都会更新(更正)这4个空白。我使用下面的代码执行类似操作,以更正错误删除的缺少成本中心。
我希望这会有所帮助,请让我知道您需要更多信息。
原始帖子:
我正在制作人力资源报告,我必须纠正4名失去终止状态的员工。我之前使用过以下声明来纠正Termed员工缺少成本中心的问题。
MERGE [Staging].[HRIS_EEMaster] AS tgt
USING (
SELECT PersNo AS EmpID,
Vol_Invol AS VIStat
FROM [dbo].[HRIS_MissingVol_Invol_Status]
) AS src ON src.EmpID = tgt.PersNo
WHEN NOT MATCHED BY TARGET
THEN INSERT (
PersNo,
Vol_Invol
)
VALUES (
src.EmpID,
src.VIStat
)
WHEN MATCHED
THEN UPDATE
SET tgt.PersNo = CASE
WHEN src.VIStat > '' THEN src.VIStat
ELSE tgt.Vol_Invol
END;
当我执行脚本时,它会返回错误:
Msg 245, Level 16, Stat 1, Line 1
Conversion failed when converting the nvarchar value 'Voluntary' to data type int.
我不确定它在说什么,因为我只是试图将“我自己”这个词从我创建的表格(参见上面的表名称脚本)放到临时表(也在上面)和列[Vol_Invol]两个表中都是nvarchar(50)。
基本上我有4个人缺少必需的状态(在源头上无法再纠正的历史信息)我希望运行此MERGE语句以使用正确的值替换来自月度导出的空白。
此脚本将用作已存在的SSIS进程中的SQL任务。
答案 0 :(得分:4)
看起来你正试图将PersNo设置为VIStat ...
SET tgt.PersNo = CASE
WHEN src.VIStat > '' THEN src.VIStat
答案 1 :(得分:2)
忘记MERGE
- it is a hornet's nest of issues我实际上重写了我遇到的任何客户代码。为什么不呢:
BEGIN TRANSACTION;
UPDATE trg
SET trg.Vol_Invol = CASE
WHEN trg.PersNo = 12345 THEN 'Voluntary'
WHEN src.VIStat > '' THEN src.VIStat
ELSE trg.Vol_Invol END
FROM Staging.HRIS_EEMaster AS tgt
INNER JOIN dbo.HRIS_MissingVol_Invol_Status AS src
ON src.EmpID = tgt.PersNo;
INSERT Staging.HRIS_EEMaster(PersNo, Vol_Invol)
SELECT src.EmpID, src.VIStat
FROM dbo.HRIS_MissingVol_Invol_Status AS src
WHERE NOT EXISTS
(
SELECT 1 FROM Staging.HRIS_EEMaster
WHERE PersNo = src.EmpID
);
COMMIT TRANSACTION;
如果INSERT
需要考虑条件,则将该部分更改为:
INSERT Staging.HRIS_EEMaster(PersNo, Vol_Invol)
SELECT src.EmpID,
CASE WHEN src.EmpID = 12345 THEN 'Voluntary' ELSE src.VIStat END
但我仍然对你的要求的几个方面感到困惑 - 你在阅读了你的单词问题之后如何最终得到你所做的MERGE
陈述,我不知道......
答案 2 :(得分:0)
我使用了以下脚本。它花了一点时间玩,但我得到了它的工作。
UPDATE [Staging].[HRIS_EEMaster]
SET [Vol_Invol] = CASE [PersNo]
WHEN '2000602' THEN 'Voluntary'
WHEN '2050004' THEN 'Voluntary'
WHEN '2050234' THEN 'Voluntary'
WHEN '2050746' THEN 'Voluntary'
ELSE [Vol_Invol]
END
如果有人有更好的剧本,请告诉我。