Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从2个不同的基在2个表上创建触发器_Sql Server_Database_Triggers_Insert - Fatal编程技术网

Sql server 从2个不同的基在2个表上创建触发器

Sql server 从2个不同的基在2个表上创建触发器,sql-server,database,triggers,insert,Sql Server,Database,Triggers,Insert,你好,我正在做一个扳机。此触发器能够比较从基F插入到我的表DOUBLON中的数据和从基T插入到客户机中的数据。 如果存在类似的TEL、TELPOR、TELPRO、TELDOM,那么它将更新F.DOUBLON.DOUBLON='OUI',否则它将放入一个'NON'。 我在我桌上的F座上创建了触发器 这就是我所做的: CREATE TRIGGER DoublonInserted ON dbo.DOUBLON AFTER INSERT AS DECLARE

你好,我正在做一个扳机。此触发器能够比较从基F插入到我的表DOUBLON中的数据和从基T插入到客户机中的数据。 如果存在类似的TEL、TELPOR、TELPRO、TELDOM,那么它将更新F.DOUBLON.DOUBLON='OUI',否则它将放入一个'NON'。 我在我桌上的F座上创建了触发器

这就是我所做的:

    CREATE TRIGGER DoublonInserted
    ON  dbo.DOUBLON
    AFTER INSERT
    AS 
    DECLARE @doublon INTEGER
    SELECT @doublon = 0
    IF SELECT count(C.TEL)
    FROM T.dbo.CLIENT AS C , inserted AS I
    where I.TEL = C.TEL
    OR I.TEL = C.TELDOM
    OR I.TEL = C.TELPRO
    OR I.TEL = C.TELPOR
    OR I.TELDOM = C.TEL
    OR I.TELDOM = C.TELDOM
    OR I.TELDOM = C.TELPRO
    OR I.TELDOM = C.TELPOR
    OR I.TELPRO = C.TEL
    OR I.TELPRO = C.TELDOM
    OR I.TELPRO = C.TELPRO
    OR I.TELPRO = C.TELPOR
    OR I.TELPOR = C.TEL
    OR I.TELPOR = C.TELDOM
    OR I.TELPOR = C.TELPRO
    OR I.TELPOR = C.TELPOR) > 1
    BEGIN
    UPDATE dbo.DOUBLON
    SET DOUBLON = 'OUI' --, @doublon = 0 
    FROM T.dbo.CLIENT AS C, inserted AS I
    where I.TEL = C.TEL
    OR I.TEL = C.TELDOM
    OR I.TEL = C.TELPRO
    OR I.TEL = C.TELPOR
    OR I.TELDOM = C.TEL
    OR I.TELDOM = C.TELDOM
    OR I.TELDOM = C.TELPRO
    OR I.TELDOM = C.TELPOR
    OR I.TELPRO = C.TEL
    OR I.TELPRO = C.TELDOM
    OR I.TELPRO = C.TELPRO
    OR I.TELPRO = C.TELPOR
    OR I.TELPOR = C.TEL
    OR I.TELPOR = C.TELDOM
    OR I.TELPOR = C.TELPRO
    OR I.TELPOR = C.TELPOR 
    END
    ELSE
    BEGIN
    UPDATE dbo.DOUBLON
    SET DOUBLON = 'NON' --, @doublon = 0
    FROM T.dbo.CLIENT AS C, inserted AS I
    where I.TEL != C.TEL
    OR I.TEL != C.TELDOM
    OR I.TEL != C.TELPRO
    OR I.TEL != C.TELPOR
    OR I.TELDOM != C.TEL
    OR I.TELDOM != C.TELDOM
    OR I.TELDOM != C.TELPRO 
    OR I.TELDOM != C.TELPOR
    OR I.TELPRO != C.TEL
    OR I.TELPRO != C.TELDOM
    OR I.TELPRO != C.TELPRO
    OR I.TELPRO != C.TELPOR
    OR I.TELPOR != C.TEL
    OR I.TELPOR != C.TELDOM
    OR I.TELPOR != C.TELPRO
    OR I.TELPOR != C.TELPOR
    END
事实上,这是可行的,但事实并非如此:

个案工作。 工作如果我的插入中有任何重复项,则为插入的每一行在我的列doublon中触发设置“NON”。 如果我的插入中只有重复项,则为插入的每行在我的列doublon中触发设置“OUI”

箱子坏了。 如果存在重复项且未插入重复项,则不工作

我试图重置我的var@doublon,但还是一样

我注意到,我的触发器将我的测试的最后结果放在了doublon列的所有行上。如果最新插入是重复数据,则所有行都将显示“是”,反之亦然

我想有人帮我解释一下原因,或者用另一种方法来使用触发器

我不能触摸数据库,不能添加列等

++基地在同一台服务器上++

谢谢你的时间和帮助

编辑:

表客户端

多布隆表

ID\u客户端->int

我想要的是: 在Doublon上设置正确的值


其他所有内容varchar50

您只需要一个查找双精度查询:

CREATE TRIGGER DoublonInserted
ON  dbo.DOUBLON
AFTER INSERT
AS BEGIN
IF EXISTS(
    select * from
    FROM T.dbo.CLIENT AS C, inserted AS I
    where I.TEL = C.TEL
    OR I.TEL = C.TELDOM
    OR I.TEL = C.TELPRO
    OR I.TEL = C.TELPOR
    OR I.TELDOM = C.TEL
    OR I.TELDOM = C.TELDOM
    OR I.TELDOM = C.TELPRO
    OR I.TELDOM = C.TELPOR
    OR I.TELPRO = C.TEL
    OR I.TELPRO = C.TELDOM
    OR I.TELPRO = C.TELPRO
    OR I.TELPRO = C.TELPOR
    OR I.TELPOR = C.TEL
    OR I.TELPOR = C.TELDOM
    OR I.TELPOR = C.TELPRO
    OR I.TELPOR = C.TELPOR)
    UPDATE dbo.DOUBLON
    SET DOUBLON = 'OUI'
    WHERE ID_CLIENT = I.ID_CLIENT;
ELSE
    UPDATE dbo.DOUBLON
    SET DOUBLON = 'NON'
    WHERE ID_CLIENT = I.ID_CLIENT;
END

我想我现在明白你的意思了。下面是如何将其创建为一个替代触发器。这应该很接近

CREATE TRIGGER DoublonInserted 
    ON dbo.DOUBLON
    INSTEAD OF INSERT AS 
BEGIN
    SET NOCOUNT ON;

    INSERT DOUBLON
    (
        ID_CLIENT
        , NOM
        , PRENOM
        , TEL
        , TELDOM
        , TELPRO
        , TELPOR
        , DOUBLON
    )
    select i.ID_CLIENT
        , i.NOM
        , i.PRENOM
        , i.TEL
        , i.TELDOM
        , i.TELPRO
        , i.TELPOR
        , case when 
                I.TEL = C.TEL
                OR I.TEL = C.TELDOM
                OR I.TEL = C.TELPRO
                OR I.TEL = C.TELPOR
                OR I.TELDOM = C.TEL
                OR I.TELDOM = C.TELDOM
                OR I.TELDOM = C.TELPRO
                OR I.TELDOM = C.TELPOR
                OR I.TELPRO = C.TEL
                OR I.TELPRO = C.TELDOM
                OR I.TELPRO = C.TELPRO
                OR I.TELPRO = C.TELPOR
                OR I.TELPOR = C.TEL
                OR I.TELPOR = C.TELDOM
                OR I.TELPOR = C.TELPRO
                OR I.TELPOR = C.TELPOR
            THEN 'OUI'
            ELSE 'NON'
            END
    FROM inserted AS I
    join T.dbo.CLIENT AS C on c.ID_CLIENT = i.ID_CLIENT;
END
细节上仍然很模糊,但我想你想要这样的东西

CREATE TRIGGER DoublonInserted 
    ON dbo.DOUBLON
    INSTEAD OF INSERT AS 
BEGIN
    SET NOCOUNT ON;

    INSERT DOUBLON
    (
        ID_CLIENT
        , NOM
        , PRENOM
        , TEL
        , TELDOM
        , TELPRO
        , TELPOR
        , DOUBLON
    )
    select i.ID_CLIENT
        , i.NOM
        , i.PRENOM
        , i.TEL
        , i.TELDOM
        , i.TELPRO
        , i.TELPOR
        ,  CASE 
                when C.TEL IS NULL
                    OR C.TELPRO IS NULL
                    OR C.TELDOM IS NULL
                    OR C.TELPOR IS NULL
                THEN 'NON'
                ELSE 'OUI'
            END
    FROM inserted AS I
    left join T.dbo.CLIENT AS C on I.TEL = C.TEL
                                OR I.TEL = C.TELPRO
                                OR I.TEL = C.TELDOM
                                OR I.TEL = C.TELPOR
END

好的!答案如下:

    CREATE TRIGGER DoublonInserted 
ON dbo.DOUBLON
INSTEAD OF INSERT AS 
    BEGIN

INSERT INTO DOUBLON
(
    ID_CLIENT
    , NOM
    , PRENOM
    , TEL
    , TELDOM
    , TELPRO
    , TELPOR
    , DOUBLON
)
select i.ID_CLIENT
    , i.NOM
    , i.PRENOM
    , i.TEL
    , i.TELDOM
    , i.TELPRO
    , i.TELPOR
    ,  CASE 
            when I.TEL = C.TEL
OR I.TEL = C.TELDOM
OR I.TEL = C.TELPRO
OR I.TEL = C.TELPOR
OR I.TELDOM = C.TEL
OR I.TELDOM = C.TELDOM 
OR I.TELDOM = C.TELPRO
OR I.TELDOM = C.TELPOR
OR I.TELPRO = C.TEL
OR I.TELPRO = C.TELDOM 
OR I.TELPRO = C.TELPRO
OR I.TELPRO = C.TELPOR
OR I.TELPOR = C.TEL
OR I.TELPOR = C.TELDOM 
OR I.TELPOR = C.TELPRO
OR I.TELPOR = C.TELPOR
            THEN 'OUI'
            ELSE 'NON'
        END
FROM inserted AS I
left join T.dbo.CLIENT AS C 
on I.TEL = C.TEL
OR I.TEL = C.TELDOMICIL
OR I.TEL = C.TELPRO
OR I.TEL = C.TELPOR
OR I.TELDOM = C.TEL
OR I.TELDOM = C.TELDOM
OR I.TELDOM = C.TELPRO
OR I.TELDOM = C.TELPOR
OR I.TELPRO = C.TEL
OR I.TELPRO = C.TELDOM
OR I.TELPRO = C.TELPRO
OR I.TELPRO = C.TELPOR
OR I.TELPOR = C.TEL
OR I.TELPOR = C.TELDOM
OR I.TELPOR = C.TELPRO
OR I.TELPOR = C.TELPOR
END

多亏了@Sean Lange你做到了@波希米亚人♦ 还有其他人

-25年前,在ANSI-92 SQL标准中,旧式的逗号分隔表格列表样式被正确的ANSI JOIN语法所取代,因此不鼓励使用这种样式。您能否请一位母语为英语的人帮助您重新编写问题?我试着读了,但我就是读不懂。你这里有一些严重的逻辑问题。首先,update语句将更新DOUBLON中的每一行。其次,如果第一个条件为true,它将只运行第一个update语句,否则它将运行第二个update语句。您的插入中可能有满足这两个条件的数据。我将尝试您的语法@marc_s谢谢您的提示!我们不想一行一行地写任何东西。相反,它应该是基于设置的更新。我不能提供太多,因为我不知道你们的桌子是什么样子。这是一个很好的起点。sql server中没有BEFORE触发器。这里发布的语法对sql server无效。@sean现在呢?我不会说sql Server是的。。。我试着在Oracle db上这样做,但sql server以前不接受,这就是我后来写的原因。我应该使用而不是吗?在两个更新中都需要连接。逻辑似乎相当接近,但这需要成为一个而不是触发器。由于这是一个插入触发器,我们可能在DOUBLON中还没有一行。我们仍然存在这样一个问题,即两个结果都是真的,因为sql server中的触发器在每个操作中都会触发一次。如果插入两行,则插入的虚拟表将有两行。还有一个问题。ID_客户端与I.ID_客户端不同不要问我为什么我不是构建体系结构的人…c.ID_客户端=I.ID_客户端每次都是假的,因为我从CSV文件插入,而ID_客户端从该文件以1、2、3开始…好的。我在这里猜测是因为我没有多少细节要处理。如何知道插入的新行与客户端中的现有行相关?也许您只需要修改连接谓词?我们不希望电话号码重复,所以我们会在这方面测试什么是您需要注意的。如果除TEL、TELPRO、TELDOM、TELPOR之外,所有数据都相同,则行不被视为重复。@PandaRasta请参阅我的最新编辑。我仍然有点猜测你的要求,但我认为这更接近你想要的。我现在没有访问DB的权限,所以我将在明天早上测试它。谢谢你的帮助和时间!