如何使用单个查询将100行插入下表?
CREATE TABLE #TEST1 (TEST_ID INT IDENTITY(1,1))
我试过下面的代码
DECLARE @numRows int,@i int
SET @numRows = 100
SET @i=1
WHILE @i<@numRows
begin
INSERT #TEST1 SELECT TOP 1 1 FROM sysobjects a
SET @i=@i+1
end
但它不起作用。
答案 0 :(得分:2)
您可以尝试以下查询
CREATE TABLE #TEST1 (TEST_ID INT IDENTITY(1,1))
SET IDENTITY_INSERT #TEST1 ON;
DECLARE @numRows int,@i int
SET @numRows = 100
SET @i=1
WHILE @i<@numRows
BEGIN
INSERT #TEST1(TEST_ID) SELECT @i
SET @i=@i+1
END
SET IDENTITY_INSERT #TEST1 OFF;
SELECT * FROM #TEST1
DROP TABLE #TEST1
由于
答案 1 :(得分:1)
副手,我想不出用一个陈述做这个的方法。您可以使用表master.dbo.spt_values
:
set identity_insert #test1 off;
insert into #test1 (test_id)
select top (100) row_number() over (order by (select null))
from master.dbo.spt_values;
set identity_insert #test1 on;
具体问题是select
需要返回某些内容,并且某些内容无法成为非列的非值。替代values
语法一次只插入一行。
你可能会做得更好:
create table #test1 (
test_id int identity(1, 1) primary key,
dummary varchar(1)
);
insert into #test1 (dummy)
select top (100) cast(NULL as varchar(1))
from master.dbo.spt_values;
这会占用最少的空间,因为NULL
varchar()
仅占用NULL
位的空间。
对于您的代码,default values
将起作用:
WHILE @i<@numRows
begin
INSERT #TEST1 DEFAULT VALUES
SET @i=@i+1
end
答案 2 :(得分:1)
此选项不需要set identity_insert on
使用合并将允许您将default values
用于多行:
MERGE INTO #TEST1
USING
(
SELECT TOP 100 *
FROM sys.objects
) S
ON 1 = 0
WHEN NOT MATCHED THEN
INSERT
DEFAULT VALUES;
(再次感谢Martin Smith对this SO post)的合并技巧
这里的优点是,它不会假设有关标识列的任何内容,甚至不存在一个标识列 - 它可用于将默认值插入到表中的任何列上,无论是单个{{1或者甚至很多列。
答案 3 :(得分:1)
或者只是这个:
INSERT INTO #Temp1 DEFAULT VALUES
GO 100
在SQL Server Management Studio中运行此操作,您将在#Temp1
中插入100行
答案 4 :(得分:0)
使用以下代码:
//replace server namd and instance with name in login window for SQL Server Management Studio (ssms)
//replace database name wit you database
string connectionString = "Server=myServerName\myInstanceName;Database=myDataBase;Trusted_Connection=True;";
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
for (int i = 0; i < 100; i++)
{
string query = string.Format("INSERT INTO [dbo].[#TEST1] (TEST_ID) VALUES ({0})", i);
cmd.CommandText = query;
cmd.ExecuteNonQuery();
}