ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

SqlServer存储过程传入Table参数

2021-07-01 01:03:33  阅读:210  来源: 互联网

标签:存储 PayrollCycle SqlServer Month Add PayrollDate Table MCU dataTable


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

有时候我们有这样一个需求,就是在后台中传过来一个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) > 0;
        }

为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](20) NULL,
    [EnterDate] [datetime] NULL,
    [LastUpdatedUser] [varchar](20) 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(7)
)
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

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

标签:存储,PayrollCycle,SqlServer,Month,Add,PayrollDate,Table,MCU,dataTable
来源: https://www.cnblogs.com/superfeeling/p/14957054.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有