介紹
今天,我們將學習如何使用單個存儲過程和用戶定義的表類型插入和更新多條記錄。我們將插入記錄如果Id列值不存在,如果Id列值重復,將更新記錄。我們將創建一個存儲過程和用戶定義的表類型來實現這個功能,我還將演示如何使用Sql調用存儲過程來測試我們的實現。
先決條件
掌握SQL Server數據庫、表和存儲過程的基本知識。
步驟1
首先,我們將創建一個名為“BulkImportDemo”的數據庫。稍后我們將使用相同的數據庫創建表和過程。
CREATE DATABASE BulkImportDemo
步驟2
在創建數據庫之后,我們將在同一個數據庫中創建表,我們將使用該數據庫來演示大容量插入和更新功能。
USE BulkImportDemo
CREATE TABLE Employee
(
Id INT IDENTITY(1,1) PRIMARY KEY,
EmpName VARCHAR(35),
Position VARCHAR(50),
[Location] VARCHAR(50),
Age INT,
Salary DECIMAL
)
這里我們創建了一個名為Employee的表,這個表以Id列作為主鍵,它是自動遞增的列。
步驟3
我們的employee表已經准備好插入和更新數據。現在我們將創建用戶定義的表數據類型。
什么是用戶定義的表類型?
用戶定義的表類型是用戶定義的數據類型,它將以表格格式包含數據。我們可以使用這些數據類型在存儲過程中作為參數傳遞,稱為表值參數。
我們將為Employee創建用戶定義的表類型,如下所示。
CREATE TYPE tblTypeEmployee AS TABLE
(
Id INT,
EmpName VARCHAR(35),
Position VARCHAR(50),
[Location] VARCHAR(50),
Age INT,
Salary DECIMAL
)
這里我們創建了用戶定義的表類型。執行上述命令后,您可以在BulkImportDemo數據庫的對象資源管理器中看到此類型。
Programmability==> Types==> User-Defnied Table Types
步驟4
現在我們將創建存儲過程來執行插入和更新操作。
CREATE PROCEDURE spBulkImportEmployee
(
@tblEmployeeTableType [dbo].tblTypeEmployee REadonly
)
AS
BEGIN
MERGE Employee AS dbEmployee
USING @tblEmployeeTableType AS tblTypeEmp
ON (dbEmployee.Id=tblTypeEmp.Id)
WHEN MATCHED THEN
UPDATE SET EmpName=tblTypeEmp.EmpName,
Position=tblTypeEmp.Position,
[Location]=tblTypeEmp.[Location],
Age=tblTypeEmp.Age,
Salary=tblTypeEmp.Salary
WHEN NOT MATCHED THEN
INSERT ([EmpName],[Position],[Location],Age,Salary)
VALUES (tblTypeEmp.EmpName,tblTypeEmp.Position,tblTypeEmp.[Location],tblTypeEmp.Age,tblTypeEmp.Salary);
END
這里我們創建了名為“spBulkImportEmployee”的過程,它接受前面步驟中創建的表類型作為參數,也稱為表值參數。
我們使用SQL server的“Merge”特性在同一個查詢中執行更新和插入。如果Id列的值已經存在於表中,那么它將更新字段的其余部分,否則將插入新記錄。
步驟5
現在,我們將了解如何測試在前面步驟中創建的存儲過程(spBulkImportEmployee)。
我們必須創建一個用戶定義表類型的變量來傳遞它作為過程的參數。
-- Declaring the variable of user defined table type
DECLARE @tblTypeEmployee tblTypeEmployee
--Inserting some records
INSERT INTO @tblTypeEmployee ([ID],[EmpName],[Position],[Location],Age,Salary)
VALUES (0,'Cedric Kelly','Senior Javascript Developer','Edinburgh',22,43360)
,(0,'Dai Riosy','Personnel Lead','London',22,43360)
,(3,'Cara Stevens','Sales Assistant','Edinburgh',22,43360)
,(0,'Thor Walton','Senior Developer','Sydney',27,217500)
,(10,'Paul Byrd','Team Leader','Sydney',42,92575)
,(6,'Finn Camacho','Software Engineer','California',34,372000)
,(0,'Rhona Davidson','Integration Specialist','Newyork',37,725000)
,(12,'Michelle House','Support Engineer','California',28,98540)
-- Executing procedure
EXEC spBulkImportEmployee @tblTypeEmployee
這里第一行用於聲明表類型變量,第二行用於在表類型變量中插入一些啞記錄,最后調用'EXEC'來執行過程。