【问题标题】:SQL Server insert multiple rows efficientlySQL Server 高效地插入多行
【发布时间】:2017-11-26 04:49:51
【问题描述】:

我有一个旧的经典 ASP 应用程序,它需要将数千行插入到 SQL Server 2008 表中。目前应用程序正在为每一行单独发送一个INSERT 命令,这需要很长时间并且同时锁定表。

有没有更好的方法来做到这一点?例如可能:

Insert all rows into a temp table 

然后做

SELECT INTO from the temp table

?

【问题讨论】:

  • 要插入的行的来源在哪里?
  • Sql server 可以直接从 CSV 批量插入 - 这个 q&a 提到了该技​​术,尽管它没有特别询问如何做到这一点 stackoverflow.com/questions/19917300/…
  • 应用程序本身中的源。它会生成一个日期列表,然后需要将它们添加到表中。
  • 由于服务器限制,无法使用 csv 文件完成此操作。
  • 你能创建一个存储过程,根据应用程序的参数批量添加行吗?

标签: sql-server sql-insert


【解决方案1】:

如果您要在应用程序本身中生成日期列表,那么您可能会生成它们并添加必要的添加来完成这项工作。

在 SQL Server 2008 中,您可以在一个命令中插入多行,这比逐行插入要好一些。

这里有几个例子说明如何做到这一点,使用表变量作为虚拟数据,并使用GETDATE() 生成几个不同的日期(您显然会在应用程序中生成这些日期):

DECLARE @TABLE AS TABLE
(
      RowID         INT IDENTITY
     ,MyDate        DATETIME
)
;

INSERT INTO @TABLE (MyDate) 
VALUES 
     (GETDATE())
    ,(GETDATE()+1)
    ,(GETDATE()+2)
    ,(GETDATE()+3)
    ,(GETDATE()+4)
    ,(GETDATE()+5)
    ,(GETDATE()+6)

SELECT * FROM @TABLE
;

返回:

RowID  | MyDate
1      | 26/11/2017 10:51:49
2      | 27/11/2017 10:51:49
3      | 28/11/2017 10:51:49
4      | 29/11/2017 10:51:49
5      | 30/11/2017 10:51:49
6      | 01/12/2017 10:51:49
7      | 02/12/2017 10:51:49

你也可以使用这种格式:

INSERT INTO @TABLE (MyDate)
SELECT GETDATE()
    UNION ALL
SELECT GETDATE() + 1
    UNION ALL
SELECT GETDATE() + 2
    UNION ALL
SELECT GETDATE() + 3
    UNION ALL
SELECT GETDATE() + 4
    UNION ALL
SELECT GETDATE() + 5
    UNION ALL
SELECT GETDATE() + 6
;

SELECT * FROM @TABLE
;

返回:

RowID  | MyDate
1      | 26/11/2017 10:51:49
2      | 27/11/2017 10:51:49
3      | 28/11/2017 10:51:49
4      | 29/11/2017 10:51:49
5      | 30/11/2017 10:51:49
6      | 01/12/2017 10:51:49
7      | 02/12/2017 10:51:49

不是 ASP 专家,但如果您在应用程序中连接字符串,您应该能够连续连接字符串,而不是为每个日期重新创建一个全新的 INSERT 语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    相关资源
    最近更新 更多