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

http://tech.ddvip.com   2008年05月27日    社区交流

内容摘要:表值参数(Table-valued parameter)是SQL Server2008的一个新特性,在以前的版本中,没有办法把表变量当作一个参数传递给存储过程。微软在SQL Server2008中引入了表值参数的特性,可以实现这项功能。

  useTestDB
  go
  select*fromTestLocationTable
  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
  (11row(s)affected)

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

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

  USE[TestDB]
  GO
  IFEXISTS(SELECT*FROMsys.objects
  WHEREobject_id=OBJECT_ID(N'[dbo].[myfunction]')ANDtypein(N'FN',N'IF',N'TF',N'FS',N'FT'))
  DROPFUNCTION[dbo].[myfunction]
  GO
  createfunctiondbo.myfunction(@TVOfficeLocation_TabetypeREADONLY)
  returnsint
  as
  begin
  declare@iint
  set@i=(SelectCOUNT(*)from@TV)
  return@i
  end

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

  USE[TestDB]
  GO
  DECLARE@TVAS[OfficeLocation_Tabetype]
  INSERTINTO@TV(Id,Shortname,Name)SELECT12,'ME1','Dubai'
  INSERTINTO@TV(Id,Shortname,Name)SELECT13,'ME2','Tehran'
  INSERTINTO@TV(Id,Shortname,Name)SELECT17,'EA1','Bombay'
  INSERTINTO@TV(Id,Shortname,Name)SELECT18,'EA2','Karachi'
  INSERTINTO@TV(Id,Shortname,Name)SELECT3,'NA3','NewYork'
  INSERTINTO@TV(Id,Shortname,Name)SELECT4,'EU1','London'
  selectdbo.myfunction(@TV)
  go

  执行结果如下:

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

  注:上面所演示的脚本都是在SQL Server 2008 CTP6版本上进行编写并经过测试的。

来源:IT专家网    作者:cyw    责编:豆豆技术应用

正在加载评论...