我不知道这个问题的正确术语/单词,也许是存储过程?所以它可能已经得到了回答。如果是这样,请将我指向正确的方向或编辑我的问题以使其更有意义。
但基本上。
我有一个表(称之为“客户”),我想将新数据(称为'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 :(得分: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有向导以复杂的方式将数据放入数据库。您无法将以前数据下面的数据存入。要做到这一点,你必须进入索引或可能行计数器的世界。
虽然,您可能想要考虑的一件事是:
在数据记录上加上时间戳。这样你就会知道导入的日期/时间。然后,如果导入数据两次导致重复,则可以识别错误数据并轻松删除。此外,时间戳将允许您在检索时按升序对数据进行排序,然后新数据将 旧数据。 :)