如何将新数据插入 table,然后再次将新数据插入同一个 table

How to insert new data into a table, then insert new data again to that same table

我不知道这个问题的正确 term/word,也许是存储过程?所以之前可能已经回答过了。如果是这样,请指出正确的方向或编辑我的问题以使其更有意义。

但基本上。

我有一个 table(称为 'customer'),我想将新数据(称为 'newcustomers')插入客户,我使用插入语句来完成。然后第二天另一批新数据到达,我想将那批新数据插入 'customer' 但在先前数据 ('newcustomers') 的下方。

我真正的问题是,如何在不必多次编写插入语句的情况下执行此操作?我也知道我的 IF OBJECT 语句每次执行该语句时都会删除 table,原因是我想尝试创建一个通过单击按钮执行的脚本

每天我都想在客户 table 下添加新客户并执行一次,例如单击执行一次,整个脚本将 run/use 一个自动程序 运行 每天等

我不知道我是否在跳出框框思考,是否有一个简单的答案。

USE [customerdatabase]
GO

IF OBJECT_ID('[customerdatabase].[dbo].[CUSTOMER]', 'U') IS NOT NULL
DROP TABLE [customerdatabase].[dbo].[CUSTOMER];

-- Create your table
CREATE TABLE [customerdatabase].[dbo].[CUSTOMER]

(

  [Customer lastname] VARCHAR (MAX)
, [Customer firstname] VARCHAR (MAX)


)

-- This will insert data in to the created table from above.
BULK INSERT CUSTOMER FROM 'C:\Users\OriginalDATA.csv'
With 

(    
    FirstROW = 2,
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
)

-- Now we want to insert new data for the week.

IF OBJECT_ID('[customerdatabase].[dbo].[newcustomers]', 'U') IS NOT 
NULL
DROP TABLE [customerdatabase].[dbo].[newcustomers];

CREATE TABLE [customerdatabase].[dbo].[newcustomers]

(

  [Customer lastname] VARCHAR (MAX)
, [Customer firstname] VARCHAR (MAX)

)

--This inserts new data seperately in to customerdatabase
BULK INSERT newcustomers FROM 'C:\Users\Downloads\neCustomer.csv'
With 

(    

FirstROW = 2,
FIELDTERMINATOR = ',',
 ROWTERMINATOR = '\n'
)

INSERT INTO CUSTOMER
SELECT * FROM newcustomers

-- repeat bulk insert again for next days batch of data
-- but do I do insert into again?

首先,您想将代码分成三个脚本。一个创建您的 table,第二个用初始数据填充客户 table,第三个用新条目填充现有 table。 (如果你做对了,你只会 运行 第一个和第二个脚本一次。也就是说......直到有人出现并希望捕获更多字段......但这完全是一个不同的问题.)

第一个脚本:

USE [customerdatabase]
GO

IF OBJECT_ID('[customerdatabase].[dbo].[CUSTOMER]', 'U') IS NOT NULL
   begin
      DROP TABLE [customerdatabase].[dbo].[CUSTOMER];
      print 'Dropped Table [customerdatabase].[dbo].[CUSTOMER]';
   end
GO

-- Create your Permanent Customer table
CREATE TABLE [customerdatabase].[dbo].[CUSTOMER]
   ([Customer lastname] VARCHAR (MAX)
   , [Customer firstname] VARCHAR (MAX)
   );
GO

-- Create your Staging Table for New customers.
IF OBJECT_ID('[customerdatabase].[dbo].[newcustomers]', 'U') IS NOT NULL
   begin
      DROP TABLE [customerdatabase].[dbo].[newcustomers];
      print 'Dropped Table [customerdatabase].[dbo].[newcustomers]';
   end
GO

CREATE TABLE [customerdatabase].[dbo].[newcustomers]
   ([Customer lastname] VARCHAR (MAX)
   , [Customer firstname] VARCHAR (MAX)
   );
GO

这会将您的永久 table 结构放入您的数据库中。请记住,如果您再次 运行 它,它将删除所有当前数据并用空的 table 替换它。所以你只想 运行 这一次。

第二个脚本:

USE [customerdatabase]
GO

-- This will insert data in to the already created Empty Customer table.
BULK INSERT [CUSTOMER] FROM 'C:\Users\OriginalDATA.csv'
With 
   (FirstROW = 2,
   FIELDTERMINATOR = ',',
   ROWTERMINATOR = '\n'
   );
GO

这也是一次性事件。它使用所有当前客户数据填充您的客户 Table。如果您再次 运行 此脚本,您将在 table 中得到重复项。可能不是什么好事。

如果您的上司曾给您一个 "New and Improved" OriginalDATA.CSV 文件,要求您删除所有旧数据并导入改进后的数据,您需要 运行 编写脚本又是两个。但这很耗时,希望不会经常发生(如果有的话)。

第三个脚本:(实际上是一个存储过程)

USE [customerdatabase]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

if exists 
   (SELECT * FROM dbo.sysobjects 
     WHERE id = object_id(N'[spAddNewCustomers]') and ObjectProperty(id,N'IsProcedure') = 1)
   begin
      drop procedure [spAddNewCustomers];
      print 'Dropped [procedure spAddNewCustomers]';
   end
GO

/****** Object: Stored Procedure [spAddNewCustomers] ******/

CREATE PROCEDURE [spAddNewCustomers]
   @pParameter1  varchar(max) = null  --Possible input parameter 1
   ,@pDebug bit = 0                   --Possible input parameter 2

AS

/*  Author   : Your Name
**  Date     : 2017-06-30
**  Name     : [spAddNewCustomers]
**  Called by: 
**  Purpose  : Add New Customers to the Customer table
**
**  Mod History: 
**    YourInitials 2017-06-30  Created Procedure
**
*/

begin

print 'Procedure [spAddNewCustomers]'
print '--------------------------------------------------';
print 'Step 01: Delete all records in the Staging Table';

DELETE FROM [newcustomers];

print '--------------------------------------------------';
print 'Step 02: This inserts new data into a Staging Table';

BULK INSERT [newcustomers] FROM 'C:\Users\Downloads\neCustomer.csv'
With 
   (FirstROW = 2,
   FIELDTERMINATOR = ',',
   ROWTERMINATOR = '\n'
   );

print '--------------------------------------------------';
print 'Step 03: Insert the Staging table data into the Customer table';

INSERT INTO [CUSTOMER]
SELECT * FROM [newcustomers];

print '-----------------------------------------------';
print 'End of Procedure [spAddNewCustomers]';

end
GO

GRANT EXECUTE ON [spAddNewCustomers] TO public
GO

这是一个将 运行 三个步骤的存储过程。 第一步将删除您的 [newcustomers] Staging table 中的所有记录。 第二步将批量导入您的 csv 数据到您的登台 table。 第三步将您的暂存 table 数据插入您的 [CUSTOMER] table.

一旦你 运行 这个脚本,它会将代码放入你的存储过程库中。 所以你只运行这个脚本一次。

之后,要调用该过程,您进入 MS SQL Server Management Studio(在正确的数据库中)并输入存储过程名称并点击 "Execute" 按钮。

IE:

spAddNewCustomers

而且只要您的 neCustomer.csv 文件在正确的位置(并且不是昨天的数据)都应该 运行 没问题。

希望对您有所帮助:)

PS,当您说:

"...将那批新数据插入 'customer' 但 之前的数据之下..."

当您将数据插入 MS SQL 数据库时,无法保证数据的顺序。 MS 具有以复杂方式将数据放入数据库的向导。您不能指望 低于 先前数据的数据。为此,您必须进入索引或行计数器的世界。

不过,您可能要考虑的一件事是:

在您的数据记录上加上时间戳。这样你就会知道导入的 date/time 。然后,如果您两次导入数据导致重复,您可以识别坏数据并将其轻松删除。此外,时间戳允许您在检索时按升序对数据进行排序,然后新数据将位于 旧数据之下。 :)