在SQL Server表中插入许多值

在SQL Server表中插入许多值,sql,sql-server-2008,Sql,Sql Server 2008,我不知道,但对你们中的许多人来说,这可能是一个毫无意义的问题,但我在一次采访中被问到,我真的很困惑,因为我刚刚开始使用SQL Server。如果要在一个步骤中将数百个字段插入到SQL Server数据库中,是否需要在SQL命令中写入每个列名 INSERT into Database(field1, field2,...field100) VALUES(val1, val2,...val3) 我从文本框、组合框和类似控件中获取这些值。这是唯一的方法还是有一个简单的方法?我对SQL Server不

我不知道,但对你们中的许多人来说,这可能是一个毫无意义的问题,但我在一次采访中被问到,我真的很困惑,因为我刚刚开始使用SQL Server。如果要在一个步骤中将数百个字段插入到SQL Server数据库中,是否需要在SQL命令中写入每个列名

INSERT into Database(field1, field2,...field100) VALUES(val1, val2,...val3)
我从文本框、组合框和类似控件中获取这些值。这是唯一的方法还是有一个简单的方法?我对SQL Server不是很了解。我正在努力学习。我使用的是C#4.0、SQL Server 2008 Express

编辑

让我解释一下这个问题。 确切地说,他们问我,他们有一个表单要由用户填写(在winforms中)。该表单在选项卡控件中被划分为多个选项卡页(5-6)。现在,他们希望通过单击的方式将数据输入数据库,而不希望逐页发送数据。相反,他们希望只需点击一个按钮就可以提供数据。要么是完整的数据,要么是无数据

我的回答是,我会通过交易来做。为了清晰起见,我将为每个页面设置一个Insert命令框架,并在事务中执行它们。如果成功,则提交,否则回滚

但立即得到的回答是:“事务处理很好,但您会在insert命令中写入所有文本框值吗?”

我说过,如果某个值为null,我将忽略,但所有时间值都不能为null,因为不同的用户将以不同的方式填写表单。因此,最好在sql命令中包含所有文本框值(或sql参数)

但问题又是一样的,“如果文本框的值是100秒还是200秒,你会写所有的文本框值吗?”

带着困惑的心情,我的回答是“是的”

他们看起来并不满意

这就是我在评论中提出问题的原因。可以用列表来完成吗。我的意思是,如果我把所有的控件都添加到一个列表中,我们可以在任何情况下使用该列表吗?但现在我觉得,我们不能


是的,他们把我从被选中的候选列表中踢了出来:-)哈哈,没关系。

如果要在表中插入所有可插入的列(即非计算列、标识列、行版本列),则可以省略显式列列表,只需执行以下操作即可

INSERT into YourTable
Values(val1, val2,...val3) /*Needs to be in order as per table definition*/
如果只为列的子集插入显式值,则需要显式列出所有列


假设遗漏的所有列都可以为空或定义了默认值(如果没有,则插入将失败),您还可以使用所需的列子集定义一个视图,然后您可以插入该视图,而无需显式列出列。

如果您想一步插入数百行,可以用下一种方法进行插入(SQL server 2008):


因为你承认自己感到困惑,这在面试中是意料之中的,我怀疑他们想要的答案是:

(将insert从“数百”减少到四行三列,以便于完整填写):

换句话说,我认为问题的大意是“是否需要为插入的每一行重复列名?”答案是否定的

另一个想法是:也许他们想让你指出在
INSERT
语句中完全省略列名的相对优点

INSERT INTO Table1 
   VALUES (1, 2, 3), 
          (1, 2, 4), 
          (2, 1, 9), 
          (2, 3, 8);
这个问题的答案是,依赖隐式顺序会增加出错的风险,可能是一个明显的错误(插入失败),也可能是一个更微妙的错误(插入成功,但由于SQL的隐式类型转换语言特性,值最终出现在错误的列中)



如果您谈论的是数百行(而不是列),那么它们可能暗示了表值参数,例如主题。

尝试使用这种非常简单的方法向表批量插入记录:

 INSERT INTO (TABLE NAME)
 (COLUMN NAMES)
 SELECT (FIELDS SHOULD MATCH THE COLUMN NAMES PROVIDED) 
 FROM (SOURCE(Could be variable or another table))

那么这是唯一的方法吗?我可以使用任何类型的列表(带有我的控件)使用它们的值?我只是在问,我对此一无所知…谢谢,我真的不确定你在问什么。唯一的选择是使用显式列列表还是不使用列列表。如果你不使用列列表,你需要按照我的回答为所有非计算列提供值。在第一个例子中,我们是否向c插入多个值列。假设每列有4个值?用于编辑“数百行”而不是“数百个字段”他们可能想让你提到真的很抱歉,有数百个字段。一个错误,问题的意思完全改变了。对不起,把我打死。对于SQLBulkCopy,让我做一些研究,谢谢。你能给我举个例子,以员工为表,以名字、姓氏、部门为字段。将帮了大忙,还是非常感谢
INSERT INTO Table1 
   VALUES (1, 2, 3), 
          (1, 2, 4), 
          (2, 1, 9), 
          (2, 3, 8);
 INSERT INTO (TABLE NAME)
 (COLUMN NAMES)
 SELECT (FIELDS SHOULD MATCH THE COLUMN NAMES PROVIDED) 
 FROM (SOURCE(Could be variable or another table))