代码之家  ›  专栏  ›  技术社区  ›  Chris Brandon

触发“列名或提供的值数与表定义不匹配”错误的T-SQL触发器

  •  5
  • Chris Brandon  · 技术社区  · 16 年前

    这是一些我没能解决的问题,我已经看了 到处 . 也许这里的人会知道!

    我有一个名为dandb_raw的表,其中有三列:dunsid(pk)、name和searchname。我也有一个触发器作用于这个表:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER TRIGGER [dandb_raw_searchNames]
        ON [dandb_raw]
        FOR INSERT, UPDATE
        AS
    
    SET NOCOUNT ON
    
      select dunsId, name into #magic from inserted
    
            UPDATE dandb
                SET dandb.searchName = company_generateSearchName(dandb.name)
                FROM (select dunsId, name from #magic) i
                INNER JOIN dandb_raw dandb
                    on i.dunsId = dandb.dunsId
    
    
            --Add new search matches
            SELECT c.companyId, dandb.dunsId
                INTO #newMatches
                FROM dandb_raw dandb
                INNER JOIN (select dunsId, name from #magic) a
                    on a.dunsId = dandb.dunsId
                INNER JOIN companies c
                    ON dandb.searchName = c.searchBrand
                    --avoid url matches that are potentially wrong
                    AND (lower(dandb.url) = lower(c.url)
                        OR dandb.url = ''
                        OR c.url = ''
                        OR c.url is null)
    
    
            INSERT INTO #newMatches (companyId, dunsId)
            SELECT c.companyId, max(dandb.dunsId) dunsId
                FROM dandb_raw dandb
                INNER JOIN
                    (
                        select
                        case when charindex('/',url) <> 0 then left(url, charindex('/',url)-1)
                        else url
                        end urlMatch, * from companies
                    ) c
                    ON dandb.url = c.urlMatch
                where subsidiaryOf = 1 and isReported = 1 and dandb.url <> ''
                    and c.companyId not in (select companyId from #newMatches)
                group by companyId
                having count(dandb.dunsId) = 1
    
            UPDATE cd
                SET cd.dunsId = nm.dunsId
                FROM companies_dandb cd
                INNER JOIN #newMatches nm
                    ON cd.companyId = nm.companyId
    GO
    

    触发器导致插入失败:

    insert into  [dandb_raw](dunsId, name)
        select 3442355, 'harper'
        union all
        select 34425355, 'har 466per'
    update [dandb_raw] set name ='grap6767e'
    

    出现此错误:

    Msg 213, Level 16, State 1, Procedure companies_contactInfo_updateTerritories, Line 20
    Insert Error: Column name or number of supplied values does not match table definition.
    

    关于这一点,最奇怪的是触发器中的每个语句都是独立工作的。这几乎就像插入是一个一次性表,如果您试图移动插入到其中一个临时表中,它会感染临时表。

    那么是什么导致触发器失效呢?怎么能阻止它?

    4 回复  |  直到 16 年前
        1
  •  2
  •   Chris Brandon    16 年前

        2
  •  1
  •   Cervo    16 年前

        3
  •  1
  •   Amy B    16 年前

    CREATE TABLE #newMatches
    (
      CompanyID int PRIMARY KEY,
      DunsID int
    )
    

    DROP TABLE #newMatches
    
        4
  •  0
  •   HLGEM    16 年前