SQL Server 2008 表值类型参数

2016-02-19 19:18 6 1 收藏

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的SQL Server 2008 表值类型参数,过去的都会过去,迎接崭新的开始,释放更美好的自己。

【 tulaoshi.com - 编程语言 】

  SQL Server 2008 表值类型参数

  目录

  准备工作1

  练习:处理表值类型参数2

  准备工作

  预计完成本实验所需的时间

  40 分钟

  目标

  在完成本实验后,您将可以:

  处理SQL Server 2008当中的表值类型参数。

  先决条件

  在完成本实验前,您必须具有:

  编写Transact-SQL 脚本与使用SQL Server Management Studio的相关经验。

  实验场景

  在许多客户场景中,都需要将一个表结构的值(一些数据行)传递到服务器中的一个存储过程/函数当中。这些值可以用来直接更新一个数据表,或根据业务逻辑进行更为复杂的处理操作。表值类型参数提供了一个更为简单的方式来定义一个数据类型,并且允许应用程序创建、更新并向存储过程和函数中传递表值类型的参数。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  随着在SQL Server 2008中引入的MERGE语句,开发人员可以更为高效的处理常见的数据仓库场景,如检查一个数据行是否存在,然后进行插入或更新。

  虚拟机环境

  从开始菜单或桌面上启用Microsoft Virtual PC 。如果Virtual PC 控制台没有启用,请查看系统托盘,然后双击系统托盘当中的Microsoft Virtual PC 。

  选择Sql08 然后点击Start。

  在虚拟机运行起来后,可以通过点击右Alt+Del 来向虚拟机发送一个Ctrl+Alt+Del 命令。

  在登录窗口中,输入以下信息:

  User name: administrator

  Password: password01!

  练习:处理表值类型参数

  表值类型参数是SQL Server 2008当中的一个新的数据类型。表值类型参数可以使用一些用户定义的表类型来声明。您可以使用表值类型参数向一个T-SQL语句、存储过程或函数中发送多行数据,并且无需创建临时表或创建多个参数。

  表值类型参数就像在OLE DB和ODBC中的参数数组一样,但是它可以提供更多的灵活性,并与T-SQL更加集成。表值类型参数也可以更加方便的进行基于集合的操作。

  在本练习中,您的目标是使用单个存储过程,使用多个数据行插入一整个数据集合。

  在SQL Server 2008以前,没有任何集成的功能,可以支持调用存储过程来完成类似的目标。

  您将实现一个存储过程,并使用表值类型参数完成这个功能。

  启动 SQL Server Management Studio

  点击Start | All Programs | Microsoft SQL Server 2008 | SQL Management Studio ,启动SQL Server Management Studio。

  在Connect to Server对话框中输入下列信息,然后点击 Connect 按钮:

Server type: Database Engine
Server name: (local)
Authentication: Windows Authentication

  点击File | Open | File。

  打开C:SQLHOLS 文件夹,然后打开Table Valued Parameters目录当中的Labscript.sql 脚本文件。

  使用存储过程中的多个参数插入数据

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  查看并选中 下列代码并点击Execute:

USE SQL2008DEMO
GO
CREATE TABLE dbo.Employee(
EmpID int NOT NULL,
EmpName nvarchar(100) NOT NULL,
EmpEmail nvarchar(100) NOT NULL)

  查看并选中 下列代码并点击Execute:

USE SQL2008Demo
GO
CREATE PROCEDURE NewEmployeeMS(@EmpID int,@EmpName nvarchar(100),@EmpEmail nvarchar(100))
As
BEGIN
INSERT INTO dbo.Employee
values(
@EmpID, @EmpName, @EmpEmail)
END

  查看并选中 下列代码并点击Execute:

USE SQL2008Demo
GO
execute NewEmployeeMS 1,'John McLean','JohnMcLean@contoso.com'
execute NewEmployeeMS 2,'Bob Smith','BobSmith@contoso.com'
execute NewEmployeeMS 3,'Ted Connery','TedConnery@contoso.com'

  查看并选中 下列代码并点击Execute:

USE SQL2008Demo
select * from dbo.Employee;
GO

  注意: 以上解决方案的缺点在于:

  1.使用了太多的与服务器的往返行程

  2.存储过程需要多次重复执行

  3.低效的代码执行

  使用本地临时表插入数据

  查看并选中 下列代码并点击Execute:

USE SQL2008DEMO
GO
Truncate table dbo.Employee

查看并选中 下列代码并点击Execute:

USE SQL2008Demo
GO
CREATE PROCEDURE NewEmployeeTempTable
As
BEGIN
 INSERT INTO dbo.Employee
 SELECT * FROM #EmployeeTempTable
ENDINSERT INTO dbo.Employee
values(
@EmpID, @EmpName, @EmpEmail)
END

  查看并选中 下列代码并点击Execute:

USE SQL2008Demo
GO
CREATE TABLE dbo.#EmployeeTempTable(
EmpID int NOT NULL,
EmpName nvarchar(100) NOT NULL,
EmpEmail nvarchar(100) NOT NULL)
Go

  注意: 这种临时表是在运行在客户端进行创建,这将会导致在客户端没有定义的情况下,服务器端的存储过程将会执行失败。

  查看并选中 下列代码并点击Execute:

USE SQL2008Demo
INSERT INTO #EmployeeTempTable
VALUES(1,'John McLean','JohnMcLean@contoso.com')
INSERT INTO #EmployeeTempTable
VALUES(2,'Bob Smith','BobSmith@contoso.com')
INSERT INTO #EmployeeTempTable
VALUES(3,'Ted Connery','TedConnery@contoso.com')

  注意: 插入的行在客户端的临时表中产生。

  查看并选中 下列代码并点击Execute:

USE SQL2008Demo
GO
exec dbo.NewEmployeeTempTable

  查看并选中 下列代码并点击Execute:

USE SQL2008Demo
GO
SELECT * FROM dbo.Employee
GO

  查看并选中 下列代码并点击Execute:

USE SQL2008Demo
GO
Drop table dbo.#EmployeeTempTable
GO

  注意:

  1.临时表是在磁盘上创建并操作的,这将会导致大量的I/O操作。

  2.它们在tempdb数据库中进行创建,并非常会导致锁定与阻碍问题。

  3.在使用完成后,您必需手动清理数据,并删除临时表。

  4.临时表的使用将会导致频繁的存储过程的重新编译。

  使用表值类型参数插入数据

  查看并选中 下列代码并点击Execute:

USE SQL2008DEMO
GO
Truncate table dbo.Employee

  查看并选中 下列代码并点击Execute:

USE SQL2008DEMO
GO
CREATE TYPE EmployeeTableType AS TABLE
(EmpID INT, EmpName nvarchar(100), EmpEmail nvarchar(100))

  注意: 在这里需要创建一个表类型来处理表值类型参数。

  查看并选中 下列代码并点击Execute:

USE SQL2008DEMO
GO
CREATE PROCEDURE NewEmployee(@EmployeeDetails EmployeeTableType READONLY)
As
BEGIN
 INSERT INTO dbo.Employee
 SELECT * FROM @EmployeeDetails
END

  注意: 表值类型参数必须作为输入类型的只读(READONLY)参数传递到过程当中。在过程体当中,您不能在表值类型参数上执行DML操作,如UPDATE, DELETE, 或INSERT操作。


  查看并选中 下列代码并点击Execute:

USE SQL2008Demo
GO
DECLARE @NewEmployees EmployeeTableType
INSERT INTO @NewEmployees
VALUES(1,'John McLean','JohnMcLean@contoso.com')
INSERT INTO @NewEmployees
VALUES(2,'Bob Smith','BobSmith@contoso.com')
INSERT INTO @NewEmployees
VALUES(3,'Ted Connery','TedConnery@contoso.com')
EXECUTE NewEmployee @NewEmployees
Go

  注意: 在过程操作完成后,表值类型参数将不会再存在。

  查看并选中 下列代码并点击Execute:

USE SQL2008Demo
GO
select * from dbo.Employee

  注意: 使用表值类型参数的优势

  表值类型参数提供了更好的灵活性,并且在许多情况下,可以提供比临时表或其它传递列表类型类型的方式更好的性能。表值类型参数提供了下列一些优势:

  拥有一个良好定义的范围,在这个执行范围结束后,它将会自动清除。

  不需要在客户端锁定正在处理的数据。

  不会导致语句的重新编译。

  提供了一个非常简单的编程模型。

  可以让您在一个单一的过程当中引入复杂的业务逻辑。

  减少与服务器的返回行程。

  可以拥有不同粒度的表结构。

  是一个强类型的类型定义。

  允许客户端指定排序顺序和唯一键。

  关闭所有应用程序并不要保存所有更改。

  关闭Virtual PC 并不要保存更改。

来源:http://www.tulaoshi.com/n/20160219/1620631.html

延伸阅读
SQL Server 2008我们也能从中体验到很多新的特性,但是对于SQL Server 2008安装,还是用图来说话比较好。本文将从SQL Server 2008安装开始讲起。 本来这篇是打算玩玩服务器功能中的第一个:adrms的,没想到装了几次都安装成功,但是有错误,后来没招了,打算将rms的数据库放到sql上来折腾折腾,所以为了不让大家觉得突兀,所以本篇SQL Server 2008安...
很多朋友并不知道FileStream 这个功能。因为FileStream 一般在安装的时候默认是不启用的,在SQL Server 2008中,引入了Filestream,使用它可以将非机构化大型数据(如文本文档、图像和视频)等以varbinary(max)的形式存储在文件系统中。使用数据库的备份还原功能可以将这些数据一起备份还原。 在选择数据库文件路径那个窗口,有一个标签是"Fil...
看MSDN: http://msdn.microsoft.com/zh-cn/library/ms187331.aspx 语法为: WAITFOR { DELAY 'time_to_pass' | TIME 'time_to_execute' | [ ( receive_statement ) | ( get_conversation_group_statement ) ] [ , TIMEOUT timeout ] } 以下示例在晚上 10:20 ( 22:20 ) 执行存储过程 sp_update_job 。 代码如下: USE msdb; E...
SQL Server 2005 SP2为我们带来了vardecimal功能,当时针对decimail和numeric数据类型推出了新的存储格式--vardecimal。vardecimal存储格式允许 decimal和numeric数据类型的存储作为一个可变长度列。 这项功能使得原来定长的decimal数据在数据文件中以可变长的格式存储,据称这项功能可以为典型的数据仓库节省30%的空间,而SQL Server 2008在这...
安装SQL2008的过程与SQL2005的程序基本一样,只不过在安装的过程中部分选项有所改变,当然如果只熟悉SQL2000安装的同志来说则是一个革命性的变动, 一、安装前的准备 1. 需要.Net Framework 3.5,若在Vista或更高的OS上需要3.5 SP1的支持(在SQL2008安装的前会自动更新安装) 2. 需要Widnows PowerShell的支持,WPS是一个功能非常强大的Shell应...

经验教程

19

收藏

54
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部