--使用表值参数向另一数据表中批量插入数据
USE DF17DataPro
--创建并使用表值参数步骤
/*
1.创建表类型并定义表结构。
有关如何创建 SQL Server 类型的信息,请参阅用户定义表类型。有关如何定义表结构的详细信息,请参阅 CREATE TABLE (Transact-SQL)。
2.声明具有表类型参数的例程。有关 SQL Server 例程的详细信息,请参阅 CREATE PROCEDURE (Transact-SQL) 和 CREATE FUNCTION (Transact-SQL)。
3.声明表类型变量,并引用该表类型。有关如何声明变量的信息,请参阅 DECLARE @local_variable (Transact-SQL)。
4.使用 INSERT 语句填充表变量。有关如何插入数据的详细信息,请参阅使用 INSERT 和 SELECT 添加行。
5.创建并填充表变量后,可以将该变量传递给例程。
*/
--具体实现
-------------------------------------------------------------
--1.创建表值参数类型BulkValue
IF EXISTS (SELECT * FROM SYS.TYPES st JOIN SYS.SCHEMAS ss ON st.SCHEMA_ID=ss.SCHEMA_ID WHERE st.name=N'[BulkValue]' AND ss.name=N'dbo' ) DROP TYPE [dbo].[BulkValue] GO CREATE TYPE BulkValue AS TABLE ( IDFlag INT , --主键ID RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, CA INT NULL, FlightID Varchar(10) NULL, --航班号 )
-------------------------------------------------------------
--(2)声明具有表类型参数的存储过程
-------------------------------------------------------------
IF exists (SELECT * FROM SYS.PROCEDURES WHERE OBJECT_ID = OBJECT_ID(N'[dbo].[InsertDBBulkProc]')) DROP PROC [dbo].InsertDBBulkProc go -- 创建一个过程来获得该表值参数数据 CREATE PROCEDURE InsertDBBulkProc @TVP BulkValue READONLY AS SET NOCOUNT ON INSERT INTO BasicMsg (RecvTime,AA,CA,FlightID ) SELECT RecvTime,AA,CA,FlightID FROM @TVP; GO
-------------------------------------------------------------
--(3) 声明一个变量来引用该类型
-------------------------------------------------------------
DECLARE @LocationTVP AS BulkValue ;
-------------------------------------------------------------
--(4) 将数据加入变量中
-------------------------------------------------------------
INSERT INTO @LocationTVP (RecvTime,AA,CA,FlightID) SELECT RecvTime,AA,CA,FlightID FROM [dbo].[BasicMsg20170518];
其中,BasicMsg20170518为源数据表。
-------------------------------------------------------------
--(5) 把表变量的数据传递给存储过程
-------------------------------------------------------------
EXEC InsertDBBulkProc @LocationTVP; GO