如何将100行插入到只有标识列的单个表中?

时间:2018-03-25 08:14:47

标签: c# sql sql-server sql-server-2008

如何使用单个查询将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

但它不起作用。

5 个答案:

答案 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或者甚至很多列。

You can see a live demo on rextester.

答案 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();
            }