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

发工资的存储过程

我有员工表Employee主键EmployeeId(自增长);还有薪资概览表Salary主键SalaryId(自增长),以及薪资细节表SalaryDetail主键EmployeeId和SalaryId
我有员工表Employee主键EmployeeId(自增长);还有薪资概览表Salary主键SalaryId(自增长),以及薪资细节表SalaryDetail主键EmployeeId和SalaryId。

现在,我要发4月份的薪水,就会在Salary表中新建一条记录用于描述当月的工资发放信息,然后在SalaryDetail表为Employee表中的每个员工创建一条工资记录。

我是数据库菜鸟,各位不要笑话,请告诉我这样一个存储过程怎么写。

9 个解决方案

#1


需要具体的表及表结构,测试数据和你想要的存储过程返回的结果!直观点!

#2



CREATE TABLE Employee(
[EmployeeID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL)

INSERT Employee ([EmployeeID], [Name]) VALUES (2, N'丁立')
INSERT Employee ([EmployeeID], [Name]) VALUES (3, N'李逵')
INSERT Employee ([EmployeeID], [Name]) VALUES (4, N'文强')
INSERT Employee ([EmployeeID], [Name]) VALUES (5, N'张三')
INSERT Employee ([EmployeeID], [Name]) VALUES (6, N'李四')

CREATE TABLE Salary(
[SalaryId] [int] IDENTITY(1,1) NOT NULL,
[SYear] [int] NULL,
[SMonth] [int] NULL
)

CREATE TABLE SalaryDetail(
[SalaryId] [int] NOT NULL,
[EmployeeId] [int] NOT NULL,
[Salary] [money] NULL)


上面是三个表的结构和部分数据,我现在要做的类似于下面的功能,至于存储过程的返回结果并不重要:

-- 新增2011年4月工资记录
INSERT Salary(SYear,SMonth) VALUES(2011,4)

-- 为每个员工增加相应工资记录
INSERT SalaryDetail(SalaryId,EmployeeId,Salary) VALUES(@SalaryId,2,3000)
INSERT SalaryDetail(SalaryId,EmployeeId,Salary) VALUES(@SalaryId,3,2000)
INSERT SalaryDetail(SalaryId,EmployeeId,Salary) VALUES(@SalaryId,4,1800)
INSERT SalaryDetail(SalaryId,EmployeeId,Salary) VALUES(@SalaryId,5,2100)
INSERT SalaryDetail(SalaryId,EmployeeId,Salary) VALUES(@SalaryId,6,5000)

#3


交个小三了...

#4


引用 3 楼 maco_wang 的回复:
交个小三了...

#5


引用 3 楼 maco_wang 的回复:
交个小三了...


 ....


按楼主的想法可以用触发器,当然在程序里也可以,用SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY这三个中的某个来控制!

create trigger t_in on Salary
after insert
as
insert into SalaryDetail
select a.SalaryId,b.EmployeeId,b.Salary
from inserted a,[员工具体的工资表] b
go

#6


CREATE TABLE Employee(
    [EmployeeID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL)
SET IDENTITY_INSERT Employee ON 
INSERT Employee ([EmployeeID], [Name]) VALUES (2, N'丁立')
INSERT Employee ([EmployeeID], [Name]) VALUES (3, N'李逵')
INSERT Employee ([EmployeeID], [Name]) VALUES (4, N'文强')
INSERT Employee ([EmployeeID], [Name]) VALUES (5, N'张三')
INSERT Employee ([EmployeeID], [Name]) VALUES (6, N'李四')
SET IDENTITY_INSERT Employee OFF
CREATE TABLE Salary(
    [SalaryId] [int] IDENTITY(1,1) NOT NULL,
    [SYear] [int] NULL,
    [SMonth] [int] NULL
)
CREATE TABLE SalaryDetail(
    [SalaryId] [int] NOT NULL,
    [EmployeeId] [int] NOT NULL,
    [Salary] [money] NULL)
-- 新增2011年4月工资记录
INSERT Salary(SYear,SMonth) VALUES(2011,4)
-- 为每个员工增加相应工资记录
INSERT SalaryDetail(SalaryId,EmployeeId,Salary) VALUES(1,2,3000)
INSERT SalaryDetail(SalaryId,EmployeeId,Salary) VALUES(1,3,2000)
INSERT SalaryDetail(SalaryId,EmployeeId,Salary) VALUES(1,4,1800)
INSERT SalaryDetail(SalaryId,EmployeeId,Salary) VALUES(1,5,2100)
INSERT SalaryDetail(SalaryId,EmployeeId,Salary) VALUES(1,6,5000)
--SQL:
CREATE PROC proc_test
@year int,
@month int
AS
BEGIN TRY
BEGIN TRAN
DECLARE @SalaryId INT
INSERT Salary([SYear], [SMonth]) VALUES(@year, @month)
SET @SalaryId = SCOPE_IDENTITY()
INSERT SalaryDetail
(
[SalaryId],
[EmployeeId],
[Salary]
)
SELECT
@SalaryId,
A.[EmployeeID],
0.00
FROM Employee A
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
END CATCH
GO
--test
EXEC proc_test 2012, 4
GO
SELECT * FROM SalaryDetail
/*
1 2 3000.00
1 3 2000.00
1 4 1800.00
1 5 2100.00
1 6 5000.00
2 2 0.00
2 3 0.00
2 4 0.00
2 5 0.00
2 6 0.00
*/

#7


引用 6 楼 wwwwgou 的回复:
SQL code
CREATE TABLE Employee(
    [EmployeeID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL)
SET IDENTITY_INSERT Employee ON 
INSERT Employee ([Emp……

佩服

#8


用游标取得employee表的所有工号
挨个获取员工各项工资值(salarydetail表的相关字段)后插入salarydetail表;
记住用事务,这个涉及到money

#9


CREATE TABLE Employee(
    [EmployeeID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL)
SET IDENTITY_INSERT Employee ON 
INSERT Employee ([EmployeeID], [Name]) VALUES (2, N'丁立')
INSERT Employee ([EmployeeID], [Name]) VALUES (3, N'李逵')
INSERT Employee ([EmployeeID], [Name]) VALUES (4, N'文强')
INSERT Employee ([EmployeeID], [Name]) VALUES (5, N'张三')
INSERT Employee ([EmployeeID], [Name]) VALUES (6, N'李四')
SET IDENTITY_INSERT Employee OFF
CREATE TABLE Salary(
    [SalaryId] [int] IDENTITY(1,1) NOT NULL,
    [SYear] [int] NULL,
    [SMonth] [int] NULL
)
CREATE TABLE SalaryDetail(
    [SalaryId] [int] NOT NULL,
    [EmployeeId] [int] NOT NULL,
    [Salary] [money] NULL)
-- 新增2011年4月工资记录
INSERT Salary(SYear,SMonth) VALUES(2011,4)
-- 为每个员工增加相应工资记录
INSERT SalaryDetail(SalaryId,EmployeeId,Salary) VALUES(1,2,3000)
INSERT SalaryDetail(SalaryId,EmployeeId,Salary) VALUES(1,3,2000)
INSERT SalaryDetail(SalaryId,EmployeeId,Salary) VALUES(1,4,1800)
INSERT SalaryDetail(SalaryId,EmployeeId,Salary) VALUES(1,5,2100)
INSERT SalaryDetail(SalaryId,EmployeeId,Salary) VALUES(1,6,5000)
--SQL:
CREATE PROC proc_test
    @year int,
    @month int
AS
BEGIN TRY
BEGIN TRAN
    DECLARE @SalaryId INT
    INSERT Salary([SYear], [SMonth]) VALUES(@year, @month)
    SET @SalaryId = SCOPE_IDENTITY()
    INSERT SalaryDetail
    (
        [SalaryId],
        [EmployeeId],
        [Salary]
    )
    SELECT
        @SalaryId,
        A.[EmployeeID],
        0.00
    FROM Employee A
COMMIT TRAN
END TRY
BEGIN CATCH
    ROLLBACK TRAN
END CATCH
GO
--test
EXEC proc_test 2012, 4
GO
SELECT * FROM SalaryDetail
/*
1    2    3000.00
1    3    2000.00
1    4    1800.00
1    5    2100.00
1    6    5000.00
2    2    0.00
2    3    0.00
2    4    0.00
2    5    0.00
2    6    0.00
*/

推荐阅读
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 开发笔记:select from具体执行相关知识介绍及案例分析
    本文由编程笔记小编整理,主要介绍了select from具体执行相关的知识,包括数据插入、查询最小rowID、查询每个重复名字的最小rowID、删除重复数据等操作,并提供了案例分析。希望对读者有一定的参考价值。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
author-avatar
Q457423356
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有