T-SQL查询可以手动工作,但不能在触发器中工作

时间:2016-01-26 17:34:34

标签: sql sql-server triggers

我有以下查询在手动执行时完美无缺。这会将表TRABAJADORES中的一些工作人员信息传递给PERSONAL。

INSERT INTO REPORTESDIARIOS.DBO.PERSONAL (DNI, Nombres, Apellidos, Contraseña, IdGrupo, Activo, Confianza)
    SELECT          
        CODTRAB, UPPER(NOMBRE), (UPPER(APEPAT) + ' ' + UPPER(APEMAT)),   
        ENCRYPTBYPASSPHRASE('password', '1234'), 12, 1, 0
    FROM            
        PIL.DBO.TRABAJADORES
    LEFT OUTER JOIN 
        ReportesDiarios.DBO.PERSONAL ON CODTRAB = DNI
    WHERE           
        DNI IS NULL

但是当我在触发器中使用它时

ALTER TRIGGER COPYNONLISTED
ON TRABAJADORES 
AFTER INSERT, UPDATE
AS 
BEGIN
    INSERT INTO REPORTESDIARIOS.DBO.PERSONAL (DNI, Nombres, Apellidos, Contraseña, IdGrupo, Activo, Confianza)
        SELECT          
            CODTRAB, UPPER(NOMBRE), (UPPER(APEPAT) + ' ' + UPPER(APEMAT)), 
            ENCRYPTBYPASSPHRASE('password', '1234'), 12, 1, 0
        FROM            
            PIL.DBO.TRABAJADORES
        LEFT OUTER JOIN
            ReportesDiarios.DBO.PERSONAL ON CODTRAB = DNI
        WHERE           
            DNI IS NULL
END
GO

它只是插入id(这是DNI)而其他字段是空白的。

离。 修改:(This is what i get on SQL

表1(表2中没有的行)

1, Samuel, Jackson, PASS, 1, 0 

使用查询手动复制相同的内容

1, Samuel, Jackson, PASS, 1, 0 

然而,如果我在触发器中使用它,它只是复制ID,但其他所有涉及查询的TRABAJADORES它不起作用它只返回空白(“”)数据

1,  ,  , PASS, 1,0  

是否有我遗漏的东西,因为我在使用inserted表时遇到了类似的问题(我放弃了这种方法)所以我不确定表中是否有限制或SQL。

1 个答案:

答案 0 :(得分:1)

好吧,我想我终于明白你要做什么了。您需要在触发器中使用插入和删除的虚拟表,但显然您遇到了一些问题。您的代码很接近,但它使用TRABAJADORES作为基表而不是插入。注意我还在查询中添加了别名,并引用了以别名开头的每一列。这使得确定某列所属的表更容易。

create TRIGGER COPYNONLISTED
ON TRABAJADORES 
AFTER INSERT, UPDATE
AS 
BEGIN
    INSERT INTO PERSONAL 
    (
        DNI
        , Nombres
        , Apellidos
        , Contraseña
        , IdGrupo
        , Activo
        , Confianza
    )
    SELECT          
        i.CODTRAB
        , UPPER(i.NOMBRE)
        , (UPPER(i.APEPAT) + ' ' + UPPER(i.APEMAT))
        , ENCRYPTBYPASSPHRASE('password', '1234')
        , 12
        , 1
        , 0
    FROM inserted i
    LEFT OUTER JOIN PERSONAL p ON i.CODTRAB = p.DNI
    WHERE p.DNI IS NULL
END
GO