首先,你想把你的代碼分解成三個腳本。一個用於創建表格,第二個用初始數據填充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有嚮導將數據以複雜的方式放入數據庫。您無法將的數據存入之前的數據。爲此,您必須進入索引或可能的行計數器的世界。
雖然,你可能要考慮的一件事是:
將時間戳上的數據記錄。這樣你會知道導入的日期/時間。然後,如果您導入的數據兩次導致重複,則可以識別不良數據並輕鬆刪除。此外,時間戳記允許您在檢索時按升序對數據進行排序,然後新數據將在舊數據的之下。 :)