SQL表值參數批量插入
--使用表值參數向另一數據表中批量插入數據
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 ( IDFlagINT , --主鍵ID RecvTime FLOAT NOT NULL , --接收時間,不存在時間相同的數據 AA INT NOT NULL, CA INT NULL, FlightID Varchar(10) NULL, --航班號 )
-------------------------------------------------------------
--(2)聲明具有表類型參數的存儲過程
-------------------------------------------------------------
IF exists (SELECT * FROM SYS.PROCEDURES WHEREOBJECT_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
SQL表值參數批量插入