热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLServer2008:表值参数的创立和应用

表值参数(Table-valuedparameter)是SQLServer2008的一个新特征,在以前的版本中,没有措施把表变量当作一个参数传递给存储过程。微软在SQLServer2008中引进了表值参数的特征,可以实现这项
表值参数(Table-valued parameter)是SQL Server 2008的一个新特征,在以前的版本中,没有措施把表变量当作一个参数传递给存储过程。微软在SQL Server2008中引进了表值参数的特征,可以实现这项功效。

  表值参数有两大长处:一是它不需要为初始的数据加锁,二是它不会导致语句重新编译。

  表值参数的创立和应用包含以下步骤:

  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所有不匹配的行。

推荐阅读
  • 本文详细介绍了如何使用libpq库与PostgreSQL后端建立连接。通过探讨PQconnectdb()函数的工作原理及其在实际应用中的使用方法,帮助读者理解并掌握建立高效、稳定的数据库连接的关键步骤。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 计算机网络复习:第五章 网络层控制平面
    本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文介绍了在使用Visual Studio 2015进行项目开发时,遇到类向导弹出“异常来自 HRESULT:0x8CE0000B”错误的解决方案。通过具体步骤和实践经验,帮助开发者快速排查并解决问题。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
author-avatar
cui115588
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有