如何将新数据插入 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 。然后,如果您两次导入数据导致重复,您可以识别坏数据并将其轻松删除。此外,时间戳允许您在检索时按升序对数据进行排序,然后新数据将位于 旧数据之下。 :)
我不知道这个问题的正确 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 。然后,如果您两次导入数据导致重复,您可以识别坏数据并将其轻松删除。此外,时间戳允许您在检索时按升序对数据进行排序,然后新数据将位于 旧数据之下。 :)