我知道我几年前就这样做过,但我不记得语法了,而且由于调出大量关于“批量导入”的帮助文档和文章,我在任何地方都找不到它。
这是我想做的,但语法不完全正确…拜托,以前做过这件事的人帮帮我吧:)
INSERT INTO dbo.MyTable (ID, Name)
VALUES (123, 'Timmy'),
(124, 'Jonny'),
(125, 'Sally')
我知道这和正确的语法很接近。我可能需要"散装"这个词,我不记得了。任何想法?
我需要这个SQL Server 2005数据库。我试过这段代码,但没有效果:
DECLARE @blah TABLE
(
ID INT NOT NULL PRIMARY KEY,
Name VARCHAR(100) NOT NULL
)
INSERT INTO @blah (ID, Name)
VALUES (123, 'Timmy')
VALUES (124, 'Jonny')
VALUES (125, 'Sally')
SELECT * FROM @blah
我在关键字“值”附近得到不正确的语法。
这将达到你想要的效果:
INSERT INTO table1 (ID, Name)
VALUES (123, 'Timmy'),
(124, 'Jonny'),
(125, 'Sally');
对于未来的开发人员,您还可以从另一个表插入:
INSERT INTO table1 (ID, Name)
SELECT
ID,
Name
FROM table2
或者甚至从多个表:
INSERT INTO table1 (column2, column3)
SELECT
t2.column,
t3.column
FROM table2 t2
INNER JOIN table3 t3
ON t2.ID = t3.ID
如果你的数据已经在你的数据库中,你可以这样做:
INSERT INTO MyTable(ID, Name)
SELECT ID, NAME FROM OtherTable
如果你需要硬编码数据,那么SQL 2008和以后的版本让你做以下…
INSERT INTO MyTable (Name, ID)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
这里的其他人建议使用一些多记录语法。为此,我建议您先插入一个临时表,然后从那里插入您的主表。
这样做的原因是,从查询中加载数据可能会花费更长的时间,最终锁定表或页的时间可能会超过所需的时间,这会降低对该表运行的其他查询的速度。
-- Make a temp table with the needed columns
select top 0 *
into #temp
from MyTable (nolock)
-- load data into it at your leisure (nobody else is waiting for this table or these pages)
insert #temp (ID, Name)
values (123, 'Timmy'),
(124, 'Jonny'),
(125, 'Sally')
-- Now that all the data is in SQL, copy it over to the real table. This runs much faster in most cases.
insert MyTable (ID, Name)
select ID, Name
from #temp
-- cleanup
drop table #temp
此外,您的id可能应该是identity(1,1),在绝大多数情况下,您可能不应该插入它们。让SQL为您决定这些事情。
创建一个表以同时插入多条记录。
CREATE TABLE TEST
(
id numeric(10,0),
name varchar(40)
)
之后创建一个存储过程来插入多条记录。
CREATE PROCEDURE AddMultiple
(
@category varchar(2500)
)
as
BEGIN
declare @categoryXML xml;
set @categoryXML = cast(@category as xml);
INSERT INTO TEST(id, name)
SELECT
x.v.value('@user','VARCHAR(50)'),
x.v.value('.','VARCHAR(50)')
FROM @categoryXML.nodes('/categories/category') x(v)
END
GO
执行过程
EXEC AddMultiple @category = '<categories>
<category user="13284">1</category>
<category user="132">2</category>
</categories>';
然后通过查询表进行检查。
select * from TEST;