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

时间:2017-06-29 13:16:13

标签: sql sql-server tsql stored-procedures insert-update

我不知道这个问题的正确术语/单词,也许是存储过程?所以它可能已经得到了回答。如果是这样,请将我指向正确的方向或编辑我的问题以使其更有意义。

但基本上。

我有一个表(称之为“客户”),我想将新数据(称为'newcustomers')插入到客户中,我使用insert语句。然后第二天又有一批新数据到货,我想将这批新数据插入“客户”,但是在之前的数据('newcustomers')下面。

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

每天我都想在客户表下添加新客户并执行此操作,例如单击执行一次,整个脚本将运行/使用自动程序每天运行它等。

我不知道我是否正在考虑方式,如果有一个简单的答案。

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?

1 个答案:

答案 0 :(得分:0)

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

第一个脚本:

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

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

第二个脚本:

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

这也是一次性事件。它使用所有当前客户数据填充客户表。如果再次运行此脚本,最终会在表格中显示重复项。可能不是一件好事。

如果您的上司曾向您提供“新的和改进的”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表中的所有记录。 第二步将批量导入csv数据到Staging表中。 第三步将您的临时表数据插入[CUSTOMER]表。

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

之后,要调用该过程,您将进入MS SQL Server Management Studio(在正确的数据库中)并键入存储过程名称并单击“执行”按钮。

IE:

spAddNewCustomers

只要您的neCustomer.csv文件位于正确的位置(并且不是昨天的数据),所有内容都可以正常运行。

希望有所帮助:)

PS,当你说:

“...将新批次的数据插入'客户',但下方以前的数据......”

将数据插入MS SQL数据库时,无法保证数据的顺序。 MS有向导以复杂的方式将数据放入数据库。您无法将以前数据下面的数据存入。要做到这一点,你必须进入索引或可能行计数器的世界。

虽然,您可能想要考虑的一件事是:

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