动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > SQL技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ SQL技巧 ]的信息

本月文章推荐
.重新安装系统后 Sql Server 2005.
.循环插入一定时间范围内的随机日.
.教你在SQL Server数据库中导入导.
.SQL Server 2008性能和扩展.
.将SQLServer2005 数据库还原或恢.
.SQL Server导入excel数据之Bug!.
.实例讲解如何实现互联网上数据库.
.SQL Server 2005: 利用新的ranki.
.Microsoft SQL Server 2005数据库.
.SQL Server编写存储过程小工具(二.
.讲解数据库加密技术的功能特性与.
.讲解三种存取备注二进制信息的方.
.SQL Server SA权限总结经典技术.
.带你轻松接触数据库命名规范的相.
.初学者必读:精讲SQL中的时间计算.
.SQL Server 2008实现高可用性.
.sql 语句 更改默认的sql server .
.数据库查询结果的动态排序(7).
.带你深入了解数据仓库优化中的星.
.SQL分页语句.

SQL Server 2008表值参数的创建和使用步骤

发表日期:2008-6-11 |


表值参数(Table-valued parameter)是SQL Server数据库2008的新特性之一,在以往的版本中,我们没有办法把表变量当作一个参数传递给存储过程。但在微软的SQL Server 2008中引入了表值参数这个特性,它可以实现此类功能。

表值参数有两个明显的优点:

1:不需要为初始的数据加锁。

2:它不会导致语句重新编译。

表值参数的创建和使用包括以下步骤:

(1) 创建表类型

(2) 创建一个可将表类型作为参数来接受的存储过程或函数

(3) 创建表变量并插入数据

(4) 调用该存储过程和函数,并将表变量作为参数传递。

下面,我们来一步步分解这个创建和使用的过程。首先,我们用以下的DDL SQL语句来创建一个名为“TestDB”的测试数据库:

USE [master]
GO

IF EXISTS (SELECT name FROM sys.databases WHERE name = N'TestDB')

DROP DATABASE TestDB
GO
Create database TestDB
go

下面,使用以下的DDL SQL语句来创建一个名为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语句将数据添加到我们上面创建的表中:

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

下面,我们需要创建一个和TestLocationTable表具有相似表结构的表类型(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

接下来,需要创建一个可以将表类型作为一个参数来接受的存储过程,使用的语句如下:

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

此存储过程将表变量作为导入值接收,并且只插入TestLocationTable中没有的数据。现在,大家可以尝试创建一个表变量,并执行上面创建的存储过程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

此时,可以使用以下的TSQL语句从表TestLocationTable查询所有的数据:

use TestDB 
go 
select * from TestLocationTable 
go

查询的结果:

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)

从返回的结果看,存储过程usp_InsertProdLocation 插入了表变量@TV中和表TestLocationTable所有不匹配的行。

另外,我们还可以将表变量传递给一个函数。下面创建一个简单的函数,语句如下所示:

USE [TestDB] 
GO 
IF EXISTS (SELECT * FROM sys.objects

WHERE 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

现在,大家可以通过创建一个表变量并将该变量作为一个参数传递给已创建的函数以调用该函数,该语句如下所示:

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

执行的结果:

(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版本上进行编写并已经测试成功。

上一篇:在SQL Server 2005数据库中更改数据架构 人气:801
下一篇:讲解孤立用户和对象名无效问题的解决方法 人气:736
浏览全部SQL Server 2008的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 HDWiki v4.0.1 bulid 081007 UTF
2008-10-7 迅易评选投票管理系统 v10.0
2008-10-7 HDWiki v4.0.1 bulid 081007 GBK
2008-10-7 Bitrac单用户博客 v1.14 bulid 0
2008-10-7 OpenX(广告管理系统) v2.6.2 多国
2008-10-7 乐铺网店系统免费普及版 v3.41
2008-9-29 酷狗音乐(原KuGoo)2008 v5.310 正
2008-9-29 QQTab 1.1
2008-9-29 网络传送带 Net Transport 2.64a
2008-9-29 谷歌金山词霸v1.8
2008-9-29 TweakVI 1.0 Build 1090
2008-9-29 ACDSee Pro 2.5 Build 333 汉化绿
2008-9-29 Winamp v5.541(2189) 周明波简体
2008-9-27 CCleaner 2.12.651
2008-9-27 Mozilla Thunderbird 2.0.0.17 英
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成