SqlServer存储过程传入Table参数

今天是周日,刚好有空闲时间整理一下这些天工作业务中遇到的问题。

有时候我们有这样一个需求,就是在后台中传过来一个IList<类>的泛型集合数据,该集合是某个类的实例集合体,然后将该集合中的实例的数据一个个地插入到数据库或者更新到数据库中去。一开始我想到的方法是拼接字符串,然后通过存储过程对接收到的字符串进行截取,再一个个地插入或者更新到数据库中去,这是最原始的方法,不过过程会比较复杂,想到这就头疼。后来查找发现说SqlServer2008中为存储过程添加了一个新特性,可以传递表类型的参数,既然可以传递表类型参数,那问题就变得简单啦。以下是开发中写的code.

1.asp.net后台:

 1         /// <summary>
 2         /// Add the PayrollCycle
 3         /// </summary>
 4         /// <param name="payrollCycle">payrollCycle</param>
 5         /// <returns>bool</returns>
 6         public bool AddPayrollCycle(IList<PayrollCycle> payrollCycles)
 7         {
 8             DataTable dataTable=new DataTable();
 9             dataTable.Columns.Add("Year",typeof(int));
10             dataTable.Columns.Add("Month",typeof(int));
11             dataTable.Columns.Add("CutoffDate",typeof(int));
12             dataTable.Columns.Add("PayrollDate",typeof(int));
13             dataTable.Columns.Add("EnterUser",typeof(string));
14             dataTable.Columns.Add("EnterDate",typeof(DateTime));
15             dataTable.Columns.Add("LastUpdatedUser",typeof(string));
16             dataTable.Columns.Add("LastUpdatedDate",typeof(DateTime));
17             foreach (PayrollCycle p in payrollCycles)
18             {
19                 DataRow dataRow = dataTable.NewRow();
20                 dataRow["Year"] = p.Year;
21                 dataRow["Month"] = p.Month;
22                 dataRow["CutoffDate"] = p.CutoffDate;
23                 dataRow["PayrollDate"] = p.PayrollDate;
24                 dataRow["EnterUser"] = UserSession.LogOnUserAccount;
25                 dataRow["EnterDate"] = DateTime.Now;
26                 dataRow["LastUpdatedUser"] = UserSession.LogOnUserAccount;
27                 dataRow["LastUpdatedDate"] = DateTime.Now;
28                 dataTable.Rows.Add(dataRow);
29             }
30
31             SqlParameter[]paras=new SqlParameter[]
32                                     {
33                                         new SqlParameter("@PayrollCycles",dataTable)
34                                     };
35             return SqlHelper.ExecuteNonQuery("MCU.USP_AddPayrollCycles", paras) > 0;
36         }

为dataTable添加column的时候,必须明确该列的typeof,否则在存储过程当中会把传入的该列当成varchar类型看待,导致某些类型转换失败

2.在SqlServer中先定义一个Table类型的Type:

 1 CREATE TYPE [MCU].[PayrollCycleType] AS TABLE(
 2     [YEAR] [int] NOT NULL,
 3     [Month] [int] NOT NULL,
 4     [CutoffDate] [int] NOT NULL,
 5     [PayrollDate] [int] NOT NULL,
 6     [EnterUser] [varchar](20) NULL,
 7     [EnterDate] [datetime] NULL,
 8     [LastUpdatedUser] [varchar](20) NULL,
 9     [LastUpdatedDate] [datetime] NULL
10 )
11 GO

接着编写一个传入上步骤中定义的表类型的参数的存储过程,该参数为Readonly(作为表类型参数必须为可读),代码如下:

 1 CREATE PROCEDURE [MCU].[USP_AddPayrollCycles]
 2 (
 3     @PayrollCycles MCU.PayrollCycleType Readonly
 4 )
 5 AS
 6 BEGIN
 7     SET NOCOUNT ON
 8     BEGIN TRANSACTION
 9     INSERT INTO MCU.PayrollCycle
10             (
11               [Year] ,
12               [Month] ,
13               CutoffDate ,
14               PayrollDate ,
15               EnterUser ,
16               EnterDate ,
17               LastUpdatedUser ,
18               LastUpdatedDate
19             )
20     SELECT
21               [Year] ,
22               [Month] ,
23               CutoffDate ,
24               PayrollDate ,
25               EnterUser ,
26               EnterDate ,
27               LastUpdatedUser ,
28               LastUpdatedDate
29               FROM @PayrollCycles
30     COMMIT TRANSACTION
31 END
32
33 GO

就这样大功告成,用起来相当方便,就不用通过拼接字符串进行数据的插入,更新操作了。

SqlServer存储过程传入Table参数,布布扣,bubuko.com

时间: 2025-01-18 07:35:17

SqlServer存储过程传入Table参数的相关文章

SQLSERVER 根据传入的参数拼接sql语句字符串,反馈结果集

ALTER PROCEDURE [dbo].[usp_visit_detail](@siteid BIGINT, @Startime VARCHAR(15), @Endtime  VARCHAR(15), @Aflag  INT = 10,                                    --初始值为10,非10,则表示有传入参数 @Area   VARCHAR(20) = 'N',               -- --初始值为N,非N,则表示有传入参数 @Nflag  

存储过程传入表参数

--- 1.创建表类型create type LocationTableType as Table(sonum varchar(20),itemNum varchar(20),itemQty int ,soarea varchar(10)) ---2.创建一个存储过程以表值参数作为输入alter proc usp_TestProcWithTable    @tb  LocationTableType READONLY   ----表值参数 "@tb" 为只读,无法修改as DECLAR

sqlserver 存储过程 带输出参数

亲测可用 CREATE PROCEDURE [dbo].[output] @acctNbr varchar(50), --会员卡号 @acctPwd1 nvarchar(50) OUT, --登录密码 @acctPwd2 nvarchar(50) OUT, --支付密码 @acctName nvarchar(50) OUT --会员卡号 as begin select @acctPwd1=AcctPswd1,@acctPwd2=AcctPswd2,@acctName=AcctName from

SQLServer存储过程基本语法

SQLSERVER: 变量的声明:声明变量时必须在变量前加@符号DECLARE @I INT 变量的赋值:变量赋值时变量前必须加setSET @I = 30 声明多个变量:DECLARE @s varchar(10),@a INT if语句: Java代码 if .. begin ... end else if .. begin ... end else begin ... end Example: Sql代码 DECLARE @d INT set @d = 1 IF @d = 1 BEGIN

SQLServer - 存储过程基本语法

oracle的建表sql转成sqlserver的建表sql时的注意点 : 1.所有的comment语句需要删除. 2.clob类型转换为text类型. 3.blob类型转换为image类型. 4.number类型转换为int,number(16,2)等转换为decimal(16,2),number(18)转换为bigint. 5.default sysdate改为default getDate(). 6.to_date('2009-12-18','yyyy-mm-dd')改为cast('2009

SQLSERVER存储过程语法详解

SQL SERVER存储过程语法: Create PROC [ EDURE ] procedure_name [ ; number ]     [ { @parameter data_type }         [ VARYING ] [ = default ] [ OUTPUT ]     ] [ ,...n ] [ WITH     { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS sq

存储过程传入datatable

存储过程传入一般的参数都很简单,今天要说一下存储过程传入datatable 类型 首先要自定义一个 表类型 CREATE TYPE [dbo].[servicedatableType] AS TABLE ( category int NULL, class int NULL, packname nvarchar(1000) NULL, packid int NULL , serviceid int null, servicename nvarchar(500) null, servicepric

创建并在项目中调用SQLSERVER存储过程的简单示例

使用SQLSERVER存储过程可以很大的提高程序运行速度,简化编程维护难度,现已得到广泛应用.创建存储过程 和数据表一样,在使用之前需要创建存储过程,它的简明语法是: 引用: Create PROC 存储过程名称 [参数列表(多个以","分隔)] AS SQL 语句 例: 引用: Create PROC upGetUserName @intUserId INT, @ostrUserName NVARCHAR(20) OUTPUT -- 要输出的参数 AS BEGIN -- 将uName

SQL SERVER 2008 存储过程传表参数

? 最近项目使用到了存储过程传入表类型参数. --定义表类型 create type t_table_type as table ( id int, name varchar(32), sex varchar(2) ) ? go --创建存储过程 CREATE PROC u_test (@t t_table_type readonly) as begin ???? select * from @t ???? end ? --调用存储过程 declare @t t_table_type ? ins