请任何人清除错误:列名或提供的值的数量与表定义不匹配

Posted

技术标签:

【中文标题】请任何人清除错误:列名或提供的值的数量与表定义不匹配【英文标题】:pls any one clear the error: Column name or number of supplied values does not match table definition 【发布时间】:2014-01-27 15:26:29 【问题描述】:
alter function fz(@mdvn int,@fdate date,@tdate date)
returns @tabs table
(
    DVN int,
    PHC int,
    HSC int,
    ANC int,
    TT1 int,
    TTB int,
    IFA int,
    BP int,
    HB int
)
as
begin
declare @DVN int,@PHC int,@HSC int,@ANC int,@TT1 int,@TTB int,@IFA int,@BP int,@HB int
declare fnc cursor for
select dvn_cd,phc_cd,hsc_cd,sum(ANC1) as ANC,SUM(TT1) as TT1,sum(TTB2) as TT2,sum(IFA) as IFA,sum(BP1) as BP,sum(HB1) as HB from
(
select dvn_cd,phc_cd,hsc_cd,
    case when visit_no=3 and Visit_date between @fdate and @tdate then 1 else 0 end as ANC1,
    case when TTB=1 and TTDate between @fdate and @tdate then 1 else 0 end as TT1,
    case when TTB>1 and TTDate between @fdate and @tdate then 1 else 0 end as TTB2,
    case when IFA=100 and ANEDD between @fdate and @tdate then 1 else 0  end as IFA,     
    case when BP>='140/90' and ANEDD between @fdate and @tdate then 1 else 0  end as BP1,
    case when HB<11 and ANEDD between @fdate and @tdate then 1 else 0  end as HB1
from anvisits3 where dvn_cd=@mdvn and ANEDD between @fdate and @tdate
)a group by dvn_cd,phc_cd,hsc_cd
open fnc
    fetch next from fnc into @DVN,@PHC,@HSC,@ANC,@TT1,@TTB,@IFA,@BP,@HB 
    while @@fetch_status=0
    begin
        insert into @tabs
            select 'DVN'+convert(varchar(20),@DVN)+'PHC'+convert(varchar(20),@PHC)+'HSC'+convert(varchar(20),@HSC)+
            'ANC'+convert(varchar(20),@ANC)+'TT1'+Convert(varchar(20),@TT1)+'TTB'+convert(varchar(20),@TTB)+'IFA'+convert(varchar(20),@IFA)+
            'BP'+convert(varchar(20),@BP)+'HB'+convert(varchar(20),@HB)
        fetch next from fnc into @DVN,@PHC,@HSC,@ANC,@TT1,@TTB,@IFA,@BP,@HB 
    end
return
end

我的错误。 消息 213,级别 16,状态 1,程序 fz,第 33 行 列名或提供的值的数量与表定义不匹配 .

【问题讨论】:

您将所有值连接到一个 single 字符串中,然后尝试将其插入到具有 9 个 int 列的表中。完全不清楚为什么您决定首先执行该字符串连接,也不清楚为什么当您可以执行 INSERT (&lt;column list&gt;) SELECT &lt;rest of select query&gt; 时觉得需要使用光标 【参考方案1】:

我想你只需要:

alter function fz(@mdvn int,@fdate date,@tdate date)
returns @tabs table
(
    DVN int,
    PHC int,
    HSC int,
    ANC int,
    TT1 int,
    TTB int,
    IFA int,
    BP int,
    HB int
)
as
begin
insert into @tabs (DVN,PHC,HSC,ANC,TT1,TTB,IFA,BP,HB)
select dvn_cd,phc_cd,hsc_cd,sum(ANC1) as ANC,SUM(TT1) as TT1,sum(TTB2) as TT2,sum(IFA) as IFA,sum(BP1) as BP,sum(HB1) as HB from
(
select dvn_cd,phc_cd,hsc_cd,
    case when visit_no=3 and Visit_date between @fdate and @tdate then 1 else 0 end as ANC1,
    case when TTB=1 and TTDate between @fdate and @tdate then 1 else 0 end as TT1,
    case when TTB>1 and TTDate between @fdate and @tdate then 1 else 0 end as TTB2,
    case when IFA=100 and ANEDD between @fdate and @tdate then 1 else 0  end as IFA,     
    case when BP>='140/90' and ANEDD between @fdate and @tdate then 1 else 0  end as BP1,
    case when HB<11 and ANEDD between @fdate and @tdate then 1 else 0  end as HB1
from anvisits3 where dvn_cd=@mdvn and ANEDD between @fdate and @tdate
)a group by dvn_cd,phc_cd,hsc_cd
return
end

顺便说一句,除非您以某种方式被这封信指控,否则我强烈建议您为您的列(此处和基表中)使用更具表现力的名称,除非这些首字母缩略词在您的行业中无处不在。

【讨论】:

但我应该使用游标方法.. 请帮助我使用该 pgm 的游标 @user3068863 - 为什么你想在这里使用光标?除非您已用尽所有其他解决方案,否则通常最好避免使用游标。 @user3068863:如果您坚持使用游标,那么您在此答案中有足够的信息可以自己解决问题,因为问题主要在于您如何插入数据。这个答案显示了正确的语法来做到这一点。然而,除非你在游标上做赋值,否则你真的不应该在这里使用游标。【参考方案2】:

错误消息本身很清楚:看起来您正试图将表本身具有的更多列插入到@tabs 结果中。例如,您可能在表中有 10 列,但尝试插入 11 列。

另一个原因:您试图将 string 数据插入到类型为 integer 的列中。

【讨论】:

【参考方案3】:

你好,不,这不是字符串到整数的问题,错误是不同的。

我怀疑它来自插入,或者订单或错误很奇怪:)

首先,您不能在函数内执行插入操作。函数只能做select

然后我计算您的光标的参数数量和您选择的数量,这似乎没问题,但它可能来自那里。 你为什么使用游标?这是没有意义的,根据选择进行插入,如果更容易阅读,请使用 with 子句。

例子:

with p as (select * from mytableA)
insert into myTableB 
select * from myTableA

哦,是的,抱歉,现在是早上 :) 您可以进行这种插入,但是为什么您仍然使用游标和临时表,而您只能进行一次选择?你有很多无用的声明:)

【讨论】:

以上是关于请任何人清除错误:列名或提供的值的数量与表定义不匹配的主要内容,如果未能解决你的问题,请参考以下文章

列名或提供的值的数量与表定义不匹配。为啥?

获取错误列名称或提供的值的数量与表定义不匹配

插入查询:列名或提供的值的数量与表定义不匹配

Dapper ExecuteAsync 得到一个 SQLException:列名或提供的值的数量与表定义不匹配

列名或提供的值的数量与更新时的表定义不匹配

sql server 2005代码错误 提示插入错误: 列名或所提供值的数目与表定义不匹配。