我不知道,但对于你们中的许多人来说这可能是没有意义的问题,但我在接受采访时被问到,我真的很困惑,因为我刚刚开始研究SQL Server。如果我在一个步骤中将数百个字段插入SQL Server数据库,是否需要在SQL命令中编写每个列名。
INSERT into Database(field1, field2,...field100) VALUES(val1, val2,...val3)
我从文本框和组合框以及类似的控件中获取这些值。这是实现这一目标的唯一方法还是有一种简单的方法可以做到这一点?我对SQL Server知之甚少。我正在努力学习它。我正在使用C#4.0,SQL Server 2008 Express。
修改
让我解释一下Interveiw问题。 确切地说,他们问我,他们有一个表格由用户填写(在winforms中)。该表格在标签控件中分为多个标签页(5-6)。现在,他们希望通过单击方式提供数据库中的数据,他们不希望逐页发送数据。相反,他们想通过单击按钮来提供数据。无论是完整数据还是无数据。
我回答的是,我会通过交易完成。为清楚起见,我将为每个页面构建一个Insert命令,并在事务中执行它们。如果成功则以其他方式回滚。
但是立即回复是,“交易很好,但是你会在insert命令中写下所有文本框值吗?”
我说如果某些东西是null我会忽略,但是所有时间值都不能为null,因为不同的用户将以不同的方式填充表单。因此,最好在SQL命令中包含所有文本框值(或sql参数)。
但问题又是一样的,“你会写出所有的文本框值,如果它们都计算到100或200s?”
心态混乱,我的回答是“是”。
他们看起来并不满足。
这就是我在1评论中提出的原因。可以用列表完成。我的意思是,如果我将所有控件添加到列表中,我们是否可以使用该列表?但现在我觉得,我们不能。
他们把我从选定的候选人名单中踢了出来:-))LOL,没关系。
答案 0 :(得分:4)
如果要在表中插入所有可插入列(即not computed,identity,rowversion)列,则可以省略显式列列表并执行
INSERT into YourTable
Values(val1, val2,...val3) /*Needs to be in order as per table definition*/
如果仅为列的子集插入显式值,则需要显式列出所有列。
假设遗漏的列都是可空的或者已定义默认值(如果不是insert
将失败),您还可以使用所需的列子集定义视图,然后您可以插入到列中而不列出列明确。
答案 1 :(得分:4)
尝试使用这种非常简单的方法将记录批量插入到表中:
INSERT INTO (TABLE NAME)
(COLUMN NAMES)
SELECT (FIELDS SHOULD MATCH THE COLUMN NAMES PROVIDED)
FROM (SOURCE(Could be variable or another table))
答案 2 :(得分:3)
如果要在一个步骤中插入数百行,则可以通过下一步方式执行此操作(SQL Server 2008):
INSERT INTO TABLENAME VALUES
(fieldValue, fieldValue, ...),
(fieldValue, fieldValue, ...),
(fieldValue, fieldValue, ...);
答案 3 :(得分:1)
因为你承认自己很困惑,这在面试中是可以预料的,我怀疑他们所寻求的答案是:
(将插入从'数百'减少到四列三列,只是为了更容易完整地写出来):
INSERT INTO Table1 (field1, field2, field3)
VALUES (1, 2, 3),
(1, 2, 4),
(2, 1, 9),
(2, 3, 8);
换句话说,我更倾向于认为问题是“你需要为插入的每一行重复列名吗?”答案是否定的。
另一个想法:也许他们希望你指出完全从INSERT
语句中省略列名的相对优点,例如
INSERT INTO Table1
VALUES (1, 2, 3),
(1, 2, 4),
(2, 1, 9),
(2, 3, 8);
这个问题的答案是,依赖于隐式顺序会增加获得错误的风险,无论是明显的错误(插入失败)还是更微妙的错误(插入成功但是值最终会出现在错误的列中SQL的隐式类型转换语言特性)。
如果你在谈论数百行(而不是列),那么他们可能会暗示表值参数,例如: Erland Sommarskog's article关于这个问题。