技术开发 频道

SQL Server 2008 表值类型参数

练习:处理表值类型参数

表值类型参数是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 脚本文件。

使用存储过程中的多个参数插入数据
查看并选中 下列代码并点击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.临时表的使用将会导致频繁的存储过程的重新编译。

0
相关文章