有一张sql表,共8列,其中6列是必须入力项,后2列是允许为空列。 在sql存储过程中写了一个insert语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有一张sql表,共8列,其中6列是必须入力项,后2列是允许为空列。 在sql存储过程中写了一个insert语句相关的知识,希望对你有一定的参考价值。

insert 表名 变量1,变量2,变量3,变量4,变量5,变量6。可以正常插入数据,但是在查询分析器中执行时提示和插入的列数和表的列数不匹配。
因为是不同人写的代码,所以我现在推断,当初写存储过程是数据库表是6个字段,但是后来又追加了2个字段。所以之前的存储过程好用。
但是为什么呢?

你应该insert into 表名(要插入的变量) values(XXX),如果只写insert会默认要插入所有列的数据 ,对啊,如果当初是6个字段,这条语句就对呀,6个字段就是他全部的变量,用insert没有问题,但是现在追加了两个字段,insert的时候,就需要insert into 表名(要插入的变量),否则单用insert后面的变量必须是全部的8个变量
举例说明:
1、表test 有两个字段 test1 类型int, test2 类型int
insert into test values(1,2);
2、现在新增了两个字段 test3 类型int test4类型int
再用上面的语句不对,只能改成insert into test(test1 test2) values(1,2)
如果直接用insert,默认的是全部字段的值,insert into test values(1,2,3,4)追问

但是我现在的情况是,原来的存储过程(插入6个字段)是可以正常执行的。

追答

你重新编译一下存储过程看看会不会报错?

追问

会抱错,但是不重新编译,处理结果也是正确的。

追答

报错信息发一下
初步分析,报错是因为表结构已经改变这条语句不匹配了,之所以会显示结果,是因为读取的缓存中的信息

追问

错误213:插入错误:列名或所提供值的数目与表定义不匹配。
是sql的缓存吗?缓存怎么清呀?

追答

把存储过程重写一下就行了

参考技术A 如果插入数据的时候是指定列的,并且新增的两个字段可以为空的话,是可以的

insert 表名(字段1,字段2,字段3,字段4,字段5,字段6) 变量1,变量2,变量3,变量4,变量5,变量6
参考技术B 能说的详细一点吗?你是怎么查询的,如果是按照6列来查询的话肯定不行啊.
你要写个查询语句,

sql中往一个表中插入数据但是其中一列需要从另一张表查状态,求指导

其中T_Message表中有(id,sender,receiver,hasAttachment,state)hasAttachment是bit类型,只有0或者1
T_AttachMessage表中有(id,msgId,filename,filesize,filedesc)
现在是往T_AttachMessage表中插入数据,但是msgId是从T_Message中查询(如果T_Message表中的hasAttachment为1那么将T_Message表中的id插入到T_AttachMessage表中)T_AttachMessage表中的其他数据另外插入.求指点呀!急!

你这个问题问的很含糊,你要明确T_AttachMessage除msgId的其他字段来自哪个表?且这个表与T_Message的关联条件是什么?这样sql就好写了。还有要求不明确,如果hasAttachment为1那么将T_Message表中的id插入到T_AttachMessage表中,那如果为0呢?是不插入吗?还是插入了记录但是为0的这个地方的msgId为空?你需要明确以上问题后,才能让别人写出正确的sql,你也可以把题目直接拷进去,别人能看得懂。我觉得你的msgId要插入是有关联条件的,不是随便选一个hasAttachment为1的就能插入追问

T_AttachMessage除msgId的其他字段是在页面自己手动填入的,如果hasAttachment为1那么将T_Message表中的id插入到T_AttachMessage表中的msgId,如果为0的话 ,什么都不插入!

追答

这样,我举个例子你看一下:
如果是页面添加数据的话,那么就是说id,filename,filesize,filedesc相当于这些数据是页面代入的值,插入数据这样就可以了,
insert into T_AttachMessage(id,msgId,filename,filesize,filedesc)
select 页面id, b.id, 页面filename, 页面filesize, 页面filedesc
from T_Message a, T_AttachMessage b
where a.** = b.**
and a.hasAttachment = 1
and b.id = 页面id;
我说的意思其实就是你代码代入的数据要跟某些表关联才能产生结果啊?不然怎么会有数据呢?
你总不可能比如我在页面添加了数据,然后可以随便从T_Message找个hasAttachment为1的相关id插入吧?

追问

492358238 你加我吧,我给你细说一下,这上面打字有限制

追答

上班不能上qq,我们qq软件是禁掉的

参考技术A insert into T_AttachMessage (xx,xx) select xx,xx from T_Message where T_Message.hasAttachment
=1追问

这样不行呀,这样只能插入T_MessageAttach中的(MsgID)
语句难道这样?这样写在后台代码里,貌似有点别扭呀!
insert into T_MessageAttach(MsgID,[FileName],FileDesc,FileSize) values('select ID from T_Message where HasAttachment=1','aa','bb','100')

追答

有哪些列你就 select 哪些列啊

以上是关于有一张sql表,共8列,其中6列是必须入力项,后2列是允许为空列。 在sql存储过程中写了一个insert语句的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中使用伪列更新列值

SQL - 插入两列,一列来自表,另一列是常量

在EXCEL中如何将其中一个表中的数据插入另一个表中,两表中其有一有列是相同的?怎么把两个表合为一个?

如何参考列在工作表之间传输数据?

SQL Server:减去相邻列分组

数据库表中的公式/计算列