Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 INSERT INTO from SELECT:INSERT语句的SELECT列表包含的项目多于INSERT列表_Sql_Sql Server_Sql Insert_Insert Into - Fatal编程技术网

Sql INSERT INTO from SELECT:INSERT语句的SELECT列表包含的项目多于INSERT列表

Sql INSERT INTO from SELECT:INSERT语句的SELECT列表包含的项目多于INSERT列表,sql,sql-server,sql-insert,insert-into,Sql,Sql Server,Sql Insert,Insert Into,我仍然得到一个奇怪的错误: INSERT语句的select列表包含的项目多于INSERT列表。SELECT值的数量必须与INSERT列的数量匹配 代码: 这个想法是从@tabTemp中选择所有电话号码,并按其行顺序排列。然后我想区分它们,并在@tab表中插入不同的数字。TOP999仅用于按目的排序,因为我将其用于函数UDF 结构如下: declare @tabTemp TABLE ( Phone1 varchar(128) NULL, Phone2 varcha

我仍然得到一个奇怪的错误:

INSERT语句的select列表包含的项目多于INSERT列表。SELECT值的数量必须与INSERT列的数量匹配

代码:

这个想法是从@tabTemp中选择所有电话号码,并按其行顺序排列。然后我想区分它们,并在@tab表中插入不同的数字。TOP999仅用于按目的排序,因为我将其用于函数UDF

结构如下:

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

    declate @tab TABLE 
    (
    Phone varchar(max) NULL
    );
编辑:

完整代码


不确定为什么在同一查询上有distinct和group by。您可以大大简化此过程

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
现在对于您收到的错误消息,它似乎不是来自这段代码,因为语法很好,列数匹配正确。我怀疑这个错误在您代码的前面某个地方


此外,您可能需要考虑使用临时表代替表变量,因为在这些表中您似乎有很多行。在表面上,

看来,您可能正在触发查询规划程序bug或其他什么。有许多不确定的事情正在发生:

该联合体将同一个表中的所有数据都分配给它自己 使用GROUPBY和distinct 我不知道你说的是什么意思

TOP999仅用于按目的排序,因为我将其用于函数UDF


你是说整个查询是在一个UDF中执行的吗?如果是这样,是否还有其他查询可能会导致该错误?

您关注的插入错误。这是不匹配的一个:

    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 
          ...

插入列表中有两列,子选择中有三列。我不能仅仅从命名来判断POR_C是否应该在Ord列中结束。

您的表上有触发器吗?@podiluska这些是表变量,所以没有任何触发器。@SeanLange或这可能只是一个示例,而不是真正的表……它们只是表变量。因此,这里没有触发器。Union all是因为选择了两个不同的列Phone1和Phone1到分离的行中
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
    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 
          ...