国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

SQL Server 2008表值參數(shù)的創(chuàng)建和使用步驟

2024-08-31 00:52:33
字體:
供稿:網(wǎng)友
表值參數(shù)(Table-valued parameter)是SQL Server數(shù)據(jù)庫2008的新特性之一,在以往的版本中,我們沒有辦法把表變量當(dāng)作一個(gè)參數(shù)傳遞給存儲(chǔ)過程。但在微軟的SQL Server 2008中引入了表值參數(shù)這個(gè)特性,它可以實(shí)現(xiàn)此類功能。

表值參數(shù)有兩個(gè)明顯的優(yōu)點(diǎn):

1:不需要為初始的數(shù)據(jù)加鎖。

2:它不會(huì)導(dǎo)致語句重新編譯。

表值參數(shù)的創(chuàng)建和使用包括以下步驟:

(1) 創(chuàng)建表類型

(2) 創(chuàng)建一個(gè)可將表類型作為參數(shù)來接受的存儲(chǔ)過程或函數(shù)

(3) 創(chuàng)建表變量并插入數(shù)據(jù)

(4) 調(diào)用該存儲(chǔ)過程和函數(shù),并將表變量作為參數(shù)傳遞。

下面,我們來一步步分解這個(gè)創(chuàng)建和使用的過程。首先,我們用以下的DDL SQL語句來創(chuàng)建一個(gè)名為“TestDB”的測試數(shù)據(jù)庫:

USE [master]GOIF EXISTS (SELECT name FROM sys.databases WHERE name = N'TestDB')DROP DATABASE TestDBGOCreate database TestDBgo

下面,使用以下的DDL SQL語句來創(chuàng)建一個(gè)名為TestLocationTable的表:

USE [TestDB] GO IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TestLocationTable]') AND type in (N'U')) DROP TABLE [dbo].[TestLocationTable] GO USE [TestDB] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[TestLocationTable]( [Id] [int] NULL, [shortname] [char](3) NULL, [name] [varchar](100) NULL ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO

然后,使用以下的DML SQL語句將數(shù)據(jù)添加到我們上面創(chuàng)建的表中:

USE [TestDB] GO insert into TestLocationTable ( Id, shortname, Name) select 1, 'NA1', 'NewYork' insert into TestLocationTable ( Id, shortname, Name) select 2, 'NA2', 'NewYork' insert into TestLocationTable ( Id, shortname, Name) select 3, 'NA3', 'NewYork' insert into TestLocationTable ( Id, shortname, Name) select 4, 'EU1', 'London' insert into TestLocationTable ( Id, shortname, Name) select 5, 'EU2', 'London' insert into TestLocationTable ( Id, shortname, Name) select 6, 'AS1', 'Tokyo' insert into TestLocationTable ( Id, shortname, Name) select 7, 'AS2', 'HongKong' go

下面,我們需要?jiǎng)?chuàng)建一個(gè)和TestLocationTable表具有相似表結(jié)構(gòu)的表類型(TABLE TYPE),語句如下所示:

USE [TestDB] GO 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] GO USE [TestDB] GO CREATE TYPE [dbo].[OfficeLocation_Tabetype] AS TABLE( [Id] [int] NULL, [shortname] [char](3) NULL, [name] [varchar](100) NULL ) GO

接下來,需要?jiǎng)?chuàng)建一個(gè)可以將表類型作為一個(gè)參數(shù)來接受的存儲(chǔ)過程,使用的語句如下:

USE [TestDB] GO IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_InsertProdLocation]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[usp_selectProdLocation] GO 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) GO

此存儲(chǔ)過程將表變量作為導(dǎo)入值接收,并且只插入TestLocationTable中沒有的數(shù)據(jù)。現(xiàn)在,大家可以嘗試創(chuàng)建一個(gè)表變量,并執(zhí)行上面創(chuàng)建的存儲(chǔ)過程usp_InsertProdLocation,語句如下所示:

use TestDB go DECLARE @TV AS [OfficeLocation_Tabetype] INSERT INTO @TV (Id, Shortname, Name) SELECT 12, 'ME1', 'Dubai' INSERT INTO @TV (Id, Shortname, Name) SELECT 13, 'ME2', 'Tehran' INSERT INTO @TV (Id, Shortname, Name) SELECT 17, 'EA1', 'Bombay' INSERT INTO @TV (Id, Shortname, Name) SELECT 18, 'EA2', 'Karachi' INSERT INTO @TV (Id, Shortname, Name) SELECT 3, 'NA3', 'NewYork' INSERT INTO @TV (Id, Shortname, Name) SELECT 4, 'EU1', 'London' exec usp_InsertProdLocation @TV go

此時(shí),可以使用以下的TSQL語句從表TestLocationTable查詢所有的數(shù)據(jù):

use TestDB go select * from TestLocationTable go

查詢的結(jié)果:

Id, shortname, name 1, NA1, NewYork 2, NA2, NewYork 3, NA3, NewYork 4, EU1, London 5, EU2, London 6, AS1, Tokyo 7, AS2, HongKong 12, ME1, Dubai 13, ME2, Tehran 17, EA1, Bombay 18, EA2, Karachi (11 row(s) affected)

從返回的結(jié)果看,存儲(chǔ)過程usp_InsertProdLocation 插入了表變量@TV中和表TestLocationTable所有不匹配的行。

另外,我們還可以將表變量傳遞給一個(gè)函數(shù)。下面創(chuàng)建一個(gè)簡單的函數(shù),語句如下所示:

USE [TestDB] GO IF EXISTS (SELECT * FROM sys.objectsWHERE object_id = OBJECT_ID(N'[dbo].[myfunction]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) DROP FUNCTION [dbo].[myfunction] GO create function dbo.myfunction (@TV OfficeLocation_Tabetype READONLY) returns int as begin declare @i int set @i=(Select COUNT(*) from @TV) return @i end

現(xiàn)在,大家可以通過創(chuàng)建一個(gè)表變量并將該變量作為一個(gè)參數(shù)傳遞給已創(chuàng)建的函數(shù)以調(diào)用該函數(shù),該語句如下所示:

USE [TestDB] GO DECLARE @TV AS [OfficeLocation_Tabetype] INSERT INTO @TV (Id, Shortname, Name) SELECT 12,'ME1','Dubai' INSERT INTO @TV (Id, Shortname, Name) SELECT 13,'ME2','Tehran' INSERT INTO @TV (Id, Shortname, Name) SELECT 17,'EA1','Bombay' INSERT INTO @TV (Id, Shortname, Name) SELECT 18,'EA2','Karachi' INSERT INTO @TV (Id, Shortname, Name) SELECT 3,'NA3','NewYork' INSERT INTO @TV (Id, Shortname, Name) SELECT 4,'EU1','London' select dbo.myfunction(@TV) go

執(zhí)行的結(jié)果:

(1 row(s) affected) (1 row(s) affected) (1 row(s) affected) (1 row(s) affected) (1 row(s) affected) (1 row(s) affected) ----------- 6

注釋:上文中的參考腳本已在SQL Server 2008 CTP6版本上進(jìn)行編寫并已經(jīng)測試成功。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 治多县| 和林格尔县| 湟中县| 左云县| 电白县| 乐亭县| 大石桥市| 志丹县| 黎川县| 青神县| 喀什市| 叙永县| 楚雄市| 浦县| 德化县| 吉林省| 洛扎县| 湄潭县| 靖安县| 海城市| 陵川县| 沙洋县| 罗甸县| 盘锦市| 绥滨县| 广宁县| 巫山县| 乌恰县| 卓尼县| 剑河县| 婺源县| 启东市| 富裕县| 兴城市| 瑞丽市| 保定市| 六盘水市| 静宁县| 磐安县| 沙洋县| 永修县|