SQL使用儲存過程批量插入和更新記錄
介紹
今天,我們將學習如何使用單個儲存過程和使用者定義的表型別插入和更新多條記錄。我們將插入記錄如果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'來執行過程。