USE [master];
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'TestDB') DROP DATABASE TestDB;
CREATE DATABASE TestDB;
USE [TestDB];
CREATE TABLE [dbo].[TestLocationTable] (
[Id] [int] NULL, [shortname] [char](3) NULL, [name] [varchar](100) NULL
) ON [PRIMARY];
-- 插入初始資料
INSERT INTO TestLocationTable VALUES (1,'NA1','NewYork'), (2,'NA2','NewYork'), (3,'NA3','NewYork'),
(4,'EU1','London'), (5,'EU2','London'), (6,'AS1','Tokyo'), (7,'AS2','HongKong');
IF EXISTS (SELECT * FROM sys.types st JOIN sys.schemas ss ON st.schema_id=ss.schema_id WHERE st.name=N'OfficeLocation_Tabetype' AND ss.name=N'dbo')
DROP TYPE [dbo].[OfficeLocation_Tabetype];
CREATE TYPE [dbo].[OfficeLocation_Tabetype] AS TABLE (
[Id] [int] NULL, [shortname] [char](3) NULL, [name] [varchar](100) NULL
);
CREATE PROCEDURE usp_InsertProdLocation
@TVP OfficeLocation_Tabetype READONLY
AS
SET NOCOUNT ON;
INSERT INTO TestLocationTable
SELECT ID, shortname, name FROM @TVP
WHERE CONVERT(varchar(10),id)+shortname+name NOT IN (
SELECT CONVERT(varchar(10),id)+shortname+name FROM TestLocationTable
);
DECLARE @TV OfficeLocation_Tabetype;
INSERT INTO @TV VALUES (12,'ME1','Dubai'), (13,'ME2','Tehran'), (17,'EA1','Bombay'), (18,'EA2','Karachi'),
(3,'NA3','NewYork'), (4,'EU1','London');
EXEC usp_InsertProdLocation @TV;
-- 查詢結果:新增 4 筆 (12,13,17,18),重複 3,4 未插入
SELECT * FROM TestLocationTable;
CREATE FUNCTION dbo.myfunction (@TV OfficeLocation_Tabetype READONLY) RETURNS INT
AS BEGIN DECLARE @i INT; SET @i = (SELECT COUNT(*) FROM @TV); RETURN @i; END;
DECLARE @TV OfficeLocation_Tabetype;
INSERT INTO @TV VALUES (12,'ME1','Dubai'), (13,'ME2','Tehran'), (17,'EA1','Bombay'), (18,'EA2','Karachi'),
(3,'NA3','NewYork'), (4,'EU1','London');
SELECT dbo.myfunction(@TV); -- 回傳 6
TVP 以表類型為基礎,支援預存程序與函數參數傳遞,免鎖定、免重編譯,大幅簡化集合資料處理。