`
netxdiy
  • 浏览: 714685 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Sql Server 2008中存储过程传入表值参数

 
阅读更多

SQL Server 2008中SQL应用系列--目录索引


经常我们会遇到需要一次往数据表中插入多行数据。此时,最简单的莫过于调用存储过程。

比如目标表如下:

USE testDb2
GO

IF NOT OBJECT_ID('tb_Demo_MultiRowsInsert') IS NULL
DROP TABLE [tb_Demo_MultiRowsInsert]

/****** Object: Table [dbo].[tb_Demo_MultiRowsInsert] Script Date: 2012/4/6 12:19:21 ******/

CREATE TABLE [dbo].[tb_Demo_MultiRowsInsert](
[TeamID] int not null primary key identity(101,1),
[PName] [Nvarchar](20) NOT NULL,
[GName] [Nvarchar](20) NOT NULL
)

GO



调用存储过程插入一个行集

/*************一次插入一个行集******************/
/********* 3w@live.cn 邀月***************/
Create Procedure CPP_InsertOneRows
(@PName Nvarchar(20)='',
@GName Nvarchar(20)=''
)
as
INSERT [dbo].[tb_Demo_MultiRowsInsert] (PName,GName)
VALUES(@PName,@GName)
GO


如果需要多行,则循环调用存储过程即可。这样做的坏处是显而易见的。于是有了改进方案:

/*************一次插入五个行集******************/
/********* 3w@live.cn 邀月***************/
Create Procedure CPP_InsertFiveRows
(
@PName1 Nvarchar(20)='',
@GName1 Nvarchar(20)='',
@PName2 Nvarchar(20)='',
@GName2 Nvarchar(20)='',
@PName3 Nvarchar(20)='',
@GName3 Nvarchar(20)='',
@PName4 Nvarchar(20)='',
@GName4 Nvarchar(20)='',
@PName5 Nvarchar(20)='',
@GName5 Nvarchar(20)=''
)
as

INSERT [dbo].[tb_Demo_MultiRowsInsert] (PName,GName)
VALUES(@PName1,@GName1)

INSERT [dbo].[tb_Demo_MultiRowsInsert] (PName,GName)
VALUES(@PName2,@GName2)

INSERT [dbo].[tb_Demo_MultiRowsInsert] (PName,GName)
VALUES(@PName3,@GName3)

INSERT [dbo].[tb_Demo_MultiRowsInsert] (PName,GName)
VALUES(@PName4,@GName4)

INSERT [dbo].[tb_Demo_MultiRowsInsert] (PName,GName)
VALUES(@PName5,@GName5)
GO


这样,一次可以插入五条数据,当然十条,也可以。但明显也有不足,首先,如果刚好要插入3条数据,那么应该避免null值和允许插入等异常。

幸运的是,SQL Server 2008提供了新的表值参数,可以一次性传入并处理多个行集。

示例如下:

/*************一次插入N个行集******************/
/********* 3w@live.cn 邀月***************/

----首先,我们定义一个表值参数类型,其实就是一个表变量
Create type dbo.tp_Demo_MultiRowsInsert as Table
(
[PName] [Nvarchar](20) NOT NULL,
[GName] [Nvarchar](20) NOT NULL
)
GO

----下面我们用这个表变量做参数,通过存储过程调用它
CREATE Procedure dbo.CPP_InsertMultiRows
(@ManyRows as tp_Demo_MultiRowsInsert readonly
)
as
INSERT [dbo].[tb_Demo_MultiRowsInsert]
SELECT PName,GName from @ManyRows

GO

----程序中构造多个行集
DECLARE @tmpRows as tp_Demo_MultiRowsInsert

----插入多个数据到参数表中
INSERT @tmpRows(PName,GName) values('胡一刀','国土资源部')
INSERT @tmpRows(PName,GName) values('胡青牛','医药局')
INSERT @tmpRows(PName,GName) values('令狐冲','文广中心')

----传递参数到存储过程,完成一次多行集插入
EXEC dbo.CPP_InsertMultiRows @tmpRows

  注意:这种一次转入多个参数的模式与SQL Servrer 2008新增的Values((group1),(group2),...,(groupn))的方式很类似,后者的应用可以看这里:

http://blog.csdn.net/downmoon/article/details/5936706

  小结:SQL Server 2008 新增参数类型-表值参数,使用用户定义的表类型来声明,借助它,可以不必创建临时表或许多参数,即可向存储过程发送多行数据。对于某些繁忙的系统,这减少了应用程序和数据库服务器之间的交互,从而减少了占用的带宽,数据库端的事务处理更高效。


邀月注:本文版权由邀月和CSDN共同所有,转载请注明出处。
助人等于自助! 3w@live.cn




分享到:
评论

相关推荐

    SQL Server存储过程中使用表值作为输入参数示例

    在2008之前如果我们想要将表作为输入参数传递给SQL Server存储过程使比较困难的,可能需要很多的逻辑处理将这些表数据作为字符串或者XML传入。 在2008中提供了表值参数。使用表值参数,可以不必创建临时表或许多参数...

    sqlserver的存储过程与 where in 多值参数

    本文将探讨在SQL Server中,存储过程与`WHERE IN`子句结合使用时,处理多值参数的几种方法。 **方法一:拼接SQL字符串并调用`EXEC`** 这是最简单也是最直观的方法。你可以在存储过程中接收一个包含多个值的参数,...

    SQL Server中存储过程比直接运行SQL语句慢的原因

    SQL Server 中存储过程比直接运行 SQL 语句慢的原因 在 SQL Server 中,存储过程比直接运行 SQL 语句慢的原因是 Parameter sniffing 问题。Parameter sniffing 是指 SQL Server 在执行存储过程时,使用参数的统计...

    SQL SERVER数据库开发之存储过程应用.rar

    在SQL Server中,可以通过`CREATE PROCEDURE`语句来创建存储过程,定义参数、设置返回值,并编写SQL语句实现特定的功能。调用存储过程则使用`EXEC`或`EXECUTE`命令,传入参数进行执行。例如: ```sql CREATE ...

    SQL Server数据库存储过程介绍及用法(参数等.....)

    存储过程,作为SQL Server数据库中的子程序,是一种预先编写并存储于数据库内的SQL脚本集合,它能够接收和返回参数,执行复杂的数据库操作。存储过程可以包含变量、控制流语句,甚至嵌套其他存储过程,使其功能强大...

    SqlServer存储过程

    ### SqlServer存储过程详解 #### 一、存储过程概述 **存储过程**是数据库中一种重要的数据对象,它实质上是一组预编写的T-SQL命令集,通过定义特定的功能来实现复杂的数据处理任务。存储过程可以被视为数据库的...

    在SQL存储过程中进行参数数组Array Parameter的处理函数

    在SQL Server中,存储过程是预编译的SQL语句集合,它们允许开发人员封装复杂的数据库操作,并且可以接受输入参数来实现灵活的数据处理。在某些情况下,我们需要一次性处理多个值,而不是单个参数,这就是参数数组...

    掌握SQL Server存储过程的命名标准

    下面将详细阐述SQL Server存储过程的命名规则及其重要性。 1. **前缀**: 存储过程名称应以`proc`作为统一的前缀,以区分系统存储过程(通常以`sp_`开头)。避免使用`sp_`前缀,因为这可能导致查询解析器在寻找...

    sqlserver存储过程

    存储过程是SQL Server中预编译的一系列SQL语句,它们存储在数据库中,可通过名称调用,以执行特定任务。几乎任何Transact-SQL代码都可以用来创建存储过程,从而实现复杂逻辑的封装和重用。 #### 存储过程设计规则 ...

    SQL Server 存储过程与实例

    以下是关于SQL Server存储过程的详细说明: 1. **存储过程的概念** 存储过程Procedure是一系列SQL语句的集合,它们在数据库中以编译好的形式存储,当需要执行时,只需要调用存储过程的名称并传入相应的参数。存储...

    SQL Server 行专列存储过程

    根据提供的标题、描述、标签及部分内容,我们可以了解到这段代码涉及的是一个名为 `up_get_activity_list` 的 SQL Server 存储过程。此存储过程的主要目的是处理数据列表并将其转化为列显示,同时还可以执行某些运算...

    学习SQL Server存储过程入门例子详解

    SQL Server 存储过程入门例子详解 SQL Server 存储过程是数据库...这三个例子展示了 SQL Server 存储过程的基本知识,包括创建存储过程、传递参数、输出参数等。掌握这些知识点对数据库管理员和开发人员来说非常重要。

    SQLSERVER存储过程大总结.doc

    SQL Server 存储过程是数据库管理系统中的一种重要功能,它允许开发者将一组复杂的SQL语句组合起来,形成一个可重用的代码单元。这个代码单元可以在需要时通过调用其名称来执行,大大提高了数据库操作的效率和代码的...

    SQL SERVER存储过程范例

    下面将详细解释标题和描述中提到的"SQL SERVER存储过程范例",并结合提供的代码片段进行分析。 首先,我们看到一个名为`sp_CreateSubPlan`的存储过程,它接受一个名为`@CPlanID`的输入参数,类型为`INT`。这个参数...

    SQL Server存储过程参数的指定.pdf

    本文将深入探讨SQL Server存储过程参数的指定方法及其在数据处理中的应用。 一、存储过程参数的类型 SQL Server中的存储过程参数分为输入参数(@param_in)、输出参数(@param_out)和输入/输出参数(@param_inout...

    sql server2000 sql存储过程

    SQL Server 2000中的存储过程是一种强大的数据库管理工具,它允许开发人员预先编写一组Transact-SQL语句,然后作为一个单元进行存储和执行。存储过程有助于提高数据库的性能、安全性和模块化编程能力。 **存储过程...

    sqlserver 2008 jdbc 驱动包

    SQLServer 2008 JDBC驱动包是针对Java开发者设计的,主要用于建立Java应用程序与Microsoft SQL Server 2008数据库之间的连接。JDBC(Java Database Connectivity)是Java平台的标准接口,它允许Java代码与其他数据库...

    sqlserver中创建类似oracle序列的存储过程

    - **使用存储过程**:调用 `getSequence` 存储过程,并传入最大值参数(如 1000),最后查询 `sequencetable` 表中的最大序列值以验证结果。 #### 注意事项 - 在实际应用中,可能还需要考虑并发问题,因为多个用户...

Global site tag (gtag.js) - Google Analytics