MERGE语句错误

时间:2013-12-06 15:30:53

标签: sql sql-server ssis

更新至原始问题:

对我正在做的事情提供一些见解。我在此表中有一个标有[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任务。

3 个答案:

答案 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

如果有人有更好的剧本,请告诉我。