INSERT INTO из SELECT: список выбора для оператора INSERT содержит больше элементов, чем список вставки.

Я все еще получаю странную ошибку:

Список выбора для оператора INSERT содержит больше элементов, чем список вставки. Количество значений SELECT должно совпадать с количеством столбцов INSERT.

Код:

    INSERT INTO @tab (Phone)
    select t2.Phone 
    from 
    (
      SELECT DISTINCT top 999 t3.Phone, MIN(t3.Ord) 
      FROM 
      (
        select Phone1 as Phone, Ord from @tabTemp
        union all
        select Phone2 as Phone, Ord from @tabTemp
      ) t3 
      GROUP BY t3.Phone 
      ORDER BY MIN(t3.Ord) asc, t3.Phone
    ) t2

Идея состоит в том, чтобы выбрать все телефонные номера из @tabTemp в порядке их строк. Затем я хочу их различать и вставлять отдельные числа в таблицу @tab. Top 999 здесь только для упорядочивания, потому что я использую его в функции (UDF).

Структуры следующие:

    declare @tabTemp TABLE 
    (
    Phone1 varchar(128) NULL,
    Phone2 varchar(128) NULL,
    Ord int
    );

    declate @tab TABLE 
    (
    Phone varchar(max) NULL
    );

ОТРЕДАКТИРОВАНО:

ПОЛНЫЙ КОД

    CREATE FUNCTION dbo.myFnc(@PID int, @VID int, @JID int, @ColumnNo int)
      RETURNS @tab TABLE 
      (
          Phone varchar(max) NULL
      )
      AS 
      BEGIN
        if @PID is null and @VID is null and @JID is null 
          return;

        if @ColumnNo is null or (@ColumnNo<>2 and @ColumnNo<>3 and @ColumnNo<>6)
          return;

        declare @catH int;
        set @catH = dbo.fncGetCategoryID('H','tt');   -- just returning int value       
        declare @kvalP int;
        set @kvalP = dbo.fncGetCategoryID('P','te');          
        declare @kvalR int;
        set @kvalR = dbo.fncGetCategoryID('R','te');

        declare @tabTemp TABLE 
        (
          Phone1 varchar(128) NULL,
          Phone2 varchar(128) NULL,
          Ord int
        );

        -- finding parent subject + current one
        WITH subj AS(
                SELECT  *
                FROM    Subjekt
                WHERE   
                  (ID = @PID and @PID is not null)
                  or
                  (ID = @VID and @VID is not null)
                  or
                  (ID = @JID and @JID is not null)            
                UNION ALL
                SELECT  t.*
                FROM    Subjekt t 
                      INNER JOIN subj r ON r.ID = t.ID
        )

        INSERT INTO @tabTemp (Phone1,Phone2)
          (select 
              (case when o.TYP1=@catH then o.TEL1 else null end) Phone1
              ,(case when o.TYP2=@catH then o.TEL2 else null end) Phone2
              ,so.POR_C
          from 
              subj s
              ,SubjektPerson so
              ,Persons o
              ,recSetup idS              
              ,recSetup idSO
              ,recSetup idO            
          where 1=1
              and idO.isValid=1
              and idSO.isValid=1
              and idS.isValid=1
              and idSO.ID0=so.ID
              and idS.ID0=s.ID
              and idO.ID0=o.ID

              and so.ID_PERSON=o.ID
              and so.ID_SUBJECT=s.ID

              and (o.TYP=@kvalP or o.TYP=@kvalR)

          ) 

          INSERT INTO @tab (Phone)
              select t2.Phone 
              from 
              (
                SELECT DISTINCT top 999 t3.Phone, MIN(t3.Ord) 
                FROM 
                (
                  select Phone1 as Phone, Ord from @tabTemp
                  union all
                  select Phone2 as Phone, Ord from @tabTemp
                ) t3 
                GROUP BY t3.Phone 
                ORDER BY MIN(t3.Ord) asc, t3.Phone
              ) t2

        RETURN
      END

person procma    schedule 22.07.2014    source источник
comment
Есть ли у вас какие-либо триггеры на ваших столах?   -  person podiluska    schedule 22.07.2014
comment
@podiluska это табличные переменные, поэтому на них нет триггеров.   -  person Sean Lange    schedule 22.07.2014
comment
@SeanLange, или это может быть просто пример, а не настоящие таблицы ...   -  person podiluska    schedule 22.07.2014
comment
это просто табличные переменные. Так что никаких триггеров.   -  person procma    schedule 24.07.2014


Ответы (3)


Вы сосредоточились на неправильной вставке. Это тот, у которого несоответствие:

    INSERT INTO @tabTemp (Phone1,Phone2)
      (select 
          (case when o.TYP1=@catH then o.TEL1 else null end) Phone1
          ,(case when o.TYP2=@catH then o.TEL2 else null end) Phone2
          ,so.POR_C
      from 
          ...

Два столбца в списке вставки, 3 столбца в подзапросе. Я не могу сказать только по названию, должно ли POR_C оказаться в столбце Ord или нет.

person Damien_The_Unbeliever    schedule 24.07.2014

Не уверен, почему у вас есть отдельная группа И группа по одному и тому же запросу. Вы можете значительно упростить это.

INSERT INTO @tab (Phone)
SELECT top 999 t3.Phone
FROM 
(
    select Phone1 as Phone, Ord from @tabTemp
    union all
    select Phone2 as Phone, Ord from @tabTemp
) t3 
GROUP BY t3.Phone 
ORDER BY MIN(t3.Ord) asc, t3.Phone

Теперь что касается сообщения об ошибке, которое вы получили, похоже, что оно исходит не из этого блока кода, потому что синтаксис в порядке и количество столбцов соответствует правильному. Я подозреваю, что ошибка где-то раньше в вашем коде.

Кроме того, вы можете рассмотреть возможность использования временных таблиц вместо табличных переменных, поскольку кажется, что у вас много строк в этих таблицах.

person Sean Lange    schedule 22.07.2014

На первый взгляд кажется, что вы, возможно, вызываете ошибку планировщика запросов или что-то в этом роде. Происходит несколько сомнительных вещей:

  • объединение всех одной таблицы с самой собой
  • Использование как группировать по, так и отдельных

Я не уверен, что вы имеете в виду под

Топ 999 здесь только для заказа по назначению, потому что я использую его в функции (UDF).

Вы имеете в виду, что весь этот запрос выполняется в UDF? Если да, то есть ли другие запросы, которые могут давать эту ошибку?

person Jon Anderson    schedule 22.07.2014
comment
Объединить все здесь из-за выбора двух разных столбцов (Phone1 и Phone1) в отдельные строки. - person procma; 24.07.2014