2017-06-29 123 views
0

我不知道這個問題的正確術語/單詞,也許存儲過程?所以它可能已經回答過。如果是這樣,請指出我正確的方向或編輯我的問題,以更有意義。如何向表中插入新數據,然後再次將新數據插入到同一表中

但基本上。

我有一個表(稱之爲'客戶'),我想插入新數據(稱爲'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? 

回答

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]臨時表中的所有記錄。 第二步將批量導入您的csv數據到您的登臺表。 第三步將您的登臺表數據插入到你的[CUSTOMER]表中。

運行此腳本後,它會將代碼放入您的存儲過程庫中。 所以你只運行一次腳本。

之後,要調用該過程,您將進入MS SQL Server Management Studio(在正確的數據庫中)並鍵入存儲過程名稱並點擊「執行」按鈕。

IE:

spAddNewCustomers

而且只要你neCustomer.csv文件是在正確的地方(而不是昨天的數據)都應該運行正常。

希望幫助:)

PS,當你說:

「......插入新的一批數據爲‘客戶’,但以前的數據......」

將數據插入MS SQL數據庫時,不保證數據的順序。 MS有嚮導將數據以複雜的方式放入數據庫。您無法將的數據存入之前的數據。爲此,您必須進入索引或可能的行計數器的世界。

雖然,你可能要考慮的一件事是:

將時間戳上的數據記錄。這樣你會知道導入的日期/時間。然後,如果您導入的數據兩次導致重複,則可以識別不良數據並輕鬆刪除。此外,時間戳記允許您在檢索時按升序對數據進行排序,然後新數據將在舊數據的之下。 :)

相關問題