请任何人清除错误:列名或提供的值的数量与表定义不匹配
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 (<column list>) SELECT <rest of select query>
时觉得需要使用光标
【参考方案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
哦,是的,抱歉,现在是早上 :) 您可以进行这种插入,但是为什么您仍然使用游标和临时表,而您只能进行一次选择?你有很多无用的声明:)
【讨论】:
以上是关于请任何人清除错误:列名或提供的值的数量与表定义不匹配的主要内容,如果未能解决你的问题,请参考以下文章