SqlServer存储过程传入Table参数
今天是周日,刚好有空闲时间整理一下这些天工作业务中遇到的问题。
有时候我们有这样一个需求,就是在后台中传过来一个IList<类>的泛型集合数据,该集合是某个类的实例集合体,然后将该集合中的实例的数据一个个地插入到数据库或者更新到数据库中去。一开始我想到的方法是拼接字符串,然后通过存储过程对接收到的字符串进行截取,再一个个地插入或者更新到数据库中去,这是最原始的方法,不过过程会比较复杂,想到这就头疼。后来查找发现说SqlServer2008中为存储过程添加了一个新特性,可以传递表类型的参数,既然可以传递表类型参数,那问题就变得简单啦。以下是开发中写的code.
1.asp.net后台:
/// <summary>
/// Add the PayrollCycle
/// </summary>
/// <param name="payrollCycle">payrollCycle</param>
/// <returns>bool</returns>
public bool AddPayrollCycle(IList<PayrollCycle> payrollCycles)
{
DataTable dataTable=new DataTable();
dataTable.Columns.Add("Year",typeof(int));
dataTable.Columns.Add("Month",typeof(int));
dataTable.Columns.Add("CutoffDate",typeof(int));
dataTable.Columns.Add("PayrollDate",typeof(int));
dataTable.Columns.Add("EnterUser",typeof(string));
dataTable.Columns.Add("EnterDate",typeof(DateTime));
dataTable.Columns.Add("LastUpdatedUser",typeof(string));
dataTable.Columns.Add("LastUpdatedDate",typeof(DateTime));
foreach (PayrollCycle p in payrollCycles)
{
DataRow dataRow = dataTable.NewRow();
dataRow["Year"] = p.Year;
dataRow["Month"] = p.Month;
dataRow["CutoffDate"] = p.CutoffDate;
dataRow["PayrollDate"] = p.PayrollDate;
dataRow["EnterUser"] = UserSession.LogOnUserAccount;
dataRow["EnterDate"] = DateTime.Now;
dataRow["LastUpdatedUser"] = UserSession.LogOnUserAccount;
dataRow["LastUpdatedDate"] = DateTime.Now;
dataTable.Rows.Add(dataRow);
} SqlParameter[]paras=new SqlParameter[]
{
new SqlParameter("@PayrollCycles",dataTable)
};
return SqlHelper.ExecuteNonQuery("MCU.USP_AddPayrollCycles", paras) > ;
}
为dataTable添加column的时候,必须明确该列的typeof,否则在存储过程当中会把传入的该列当成varchar类型看待,导致某些类型转换失败
2.在SqlServer中先定义一个Table类型的Type:
CREATE TYPE [PayrollCycleType] AS TABLE(
[YEAR] [int] NOT NULL,
[Month] [int] NOT NULL,
[CutoffDate] [int] NOT NULL,
[PayrollDate] [int] NOT NULL,
[EnterUser] [varchar]() NULL,
[EnterDate] [datetime] NULL,
[LastUpdatedUser] [varchar]() NULL,
[LastUpdatedDate] [datetime] NULL
)
GO
接着编写一个传入上步骤中定义的表类型的参数的存储过程,该参数为Readonly(作为表类型参数必须为可读),代码如下:
插入操作:
CREATE PROCEDURE [MCU].[USP_AddPayrollCycles]
(
@PayrollCycles MCU.PayrollCycleType Readonly
)
AS
BEGIN
SET NOCOUNT ON
BEGIN TRANSACTION
INSERT INTO MCU.PayrollCycle
( [Year] ,
[Month] ,
CutoffDate ,
PayrollDate ,
EnterUser ,
EnterDate ,
LastUpdatedUser ,
LastUpdatedDate
)
SELECT [Year] ,
[Month] ,
CutoffDate ,
PayrollDate ,
EnterUser ,
EnterDate ,
LastUpdatedUser ,
LastUpdatedDate
FROM @PayrollCycles
COMMIT TRANSACTION
END GO
更新操作:
CREATE PROCEDURE [MCU].[USP_UpdatePayrollCycle]
(
@PayrollCycles MCU.PayrollCycleType READONLY,
@TypeOfDate NVARCHAR()
)
AS
BEGIN
SET NOCOUNT ON
--declare an table
DECLARE @temp AS MCU.PayrollCycleType
--insert into @temp from @PayrollCycles
INSERT INTO @temp
( [YEAR] ,
[Month] ,
CutoffDate ,
PayrollDate
)
SELECT
[YEAR] ,
[Month] ,
CutoffDate ,
PayrollDate
FROM @PayrollCycles --Update the PayrollCycle
IF(@TypeOfDate='Payroll')
BEGIN
UPDATE MCU.PayrollCycle
SET
PayrollDate=t.PayrollDate
FROM
@temp t
WHERE MCU.PayrollCycle.[Year]=t.[Year] AND MCU.PayrollCycle.[Month]=t.[Month]
END IF(@TypeOfDate='Cut-off')
BEGIN
UPDATE MCU.PayrollCycle
SET
CutoffDate=t.CutOffDate
FROM @temp t
WHERE MCU.PayrollCycle.[Year]=t.[Year] AND MCU.PayrollCycle.[Month]=t.[Month]
END
END GO
就这样大功告成,用起来相当方便,就不用通过拼接字符串进行数据的插入,更新操作了。
SqlServer存储过程传入Table参数的更多相关文章
- PROCEDURE存储过程传入表参数
) ,itemNum ) ,itemQty )) ---2.创建一个存储过程以表值参数作为输入 alter proc usp_TestProcWithTable @tb LocationTa ...
- clob字段的值插入和查询N种方法【包括java调用存储过程传入clob参数】
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import jav ...
- SQL 存储过程 传入数组参数
今天在做统计数据的时候,传入数组导致数据不显示.解决方式和大家分享一下: --参数@CompanyName='北京,天津,上海' DECLARE @PointerPrev int DECLAR ...
- SQLSERVER 根据传入的参数拼接sql语句字符串,反馈结果集
ALTER PROCEDURE [dbo].[usp_visit_detail](@siteid BIGINT, @Startime VARCHAR(15), @Endtime VARCHAR(15 ...
- php通过存储过程传入汉字参数并写入数据库
写入数据库,汉字为???样式的乱码,后根据网上介绍的方法,参数前加N,数据库汉字内容变成空白. 解决方法,在PHP中先转为base64,再在mysql中base64解码,前提先保证mysql中有bas ...
- sqlserver 存储过程 带输出参数
CREATE PROCEDURE [dbo].[output] @acctNbr varchar(), --会员卡号 @acctPwd1 nvarchar() OUT, --登录密码 @acctPwd ...
- SQLSERVER procedure 传入参数为DataTable类型 C#该怎么写
以上为数据库中存储过程传入参数为table类型 table类型在数据库中存在为: 最后在C#实现方式为:
- SQLSERVER存储过程语法详解
CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ...
- 创建并在项目中调用SQLSERVER存储过程的简单示例
使用SQLSERVER存储过程可以很大的提高程序运行速度,简化编程维护难度,现已得到广泛应用.创建存储过程 和数据表一样,在使用之前需要创建存储过程,它的简明语法是: 引用: Create PROC ...
随机推荐
- SqlCommand和SqlDataAdapter有什么区别
因为DataSet是离线的,所以SqlDataAdapter这个对象是连接DataSet和数据库的桥梁,所有对DataSet的操作(填充,更新等)都要通过他 ado.net数据访问有两种方式: 1.离 ...
- css导航条
#nav ul { display: none; position: absolute; padding-top: 0px;} #nav li:hover ul { display: block;}
- 我永远的 dell 15r
陪伴我三年多的15r 让我疯狂过.努力过.更记录了我很多的成长,与很多个瞬间.看到它是有感情的.还记得第一次失去她.我好像失去了自己. 我是一个程序员.每个程序员都有自己的环境配置.不同的软件.就是 ...
- MFC 多线程
MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息 队列和消息循环. 工作者线程没有消息机制,通 ...
- Stata和Matlab联合处理金融数据
Stata是统计学专业软件,可以很方便的对数据处理,但几乎只能按照整行整列进行,而且每次只能加载一个矩阵(dta文件),如果要用到多个矩阵数据进行操作或进行复杂的循环控制,就力不从心了. 而Matla ...
- Java中list<Object>集合去重实例
一:Java中list去重的方法很多,下面说一下其中一种方法:把list里的对象遍历一遍,用list.contain(),如果不存在就放入到另外一个list集合中: 二:实例 这里需要注意的是:使用c ...
- Fun with dynamicobject dynamic and the settings table
What came before In my previous post I discussed ways of making the settings table using Generics to ...
- HTML5简介、视频
HTML5 建立的一些规则: 新特性应该基于 HTML.CSS.DOM 以及 JavaScript. 减少对外部插件的需求(比如 Flash) 更优秀的错误处理 更多取代脚本的标记 HTML5 应该独 ...
- 根据样式获取被选中的checkbox
<ul id="> </div> </li></ul> $("#btn_CheckManagerCompletionCreateAt ...
- IOS 面试 --- 动画 block
1 谈谈对Block 的理解?并写出一个使用Block执行UIVew动画? 答案:Block是可以获取其他函数局部变量的匿名函数,其不但方便开发,并且可以大幅提高应用的执行效率(多核心CPU可直接处理 ...