




免费预览已结束,剩余28页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【原创:数据库】SQL SERVER数据库开发之存储过程应用可能有不少朋友使用SQL SERVER做开发也已经有段日子,但还没有或者很少在项目中使用存储过程,或许有些朋友认为根本没有必要使用存储过程等等。其实当你一个项目做完到了维护阶段时,就会发现存储过程给我们带来了好处了,修改方便,不能去改我们的应用程序,只需要改存储过程的内容,而且还可以使我们的程序速度得到提高。QUOTE:SQL SERVER 联机丛书中的定义:存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。也可以创建在 Microsoft SQL Server 启动时自动运行的存储过程。要使用存储过程,首先我们必需熟悉一些基本的T-SQL语句,因为存储过程是由于一组T-SQL语句构成的,并且,我们需要了解一些关于函数、过程的概念,因为我们需要在应用程序中调用存储过程,就像我们调用应用程序的函数一样,不过调用的方法有些不同。下面我们来看一下存储过程的建立和使用方法。一、创建存储过程和数据表一样,在使用之前我们需要创建存储过程,它的简明语法是:QUOTE:CREATE PROC 存储过程名称 参数列表(多个以“,”分隔)ASSQL 语句例:QUOTE:CREATE PROC upGetUserNameintUserId INT,ostrUserName NVARCHAR(20) OUTPUT - 要输出的参数ASBEGIN - 将uName的值赋给 ostrUserName 变量,即要输出的参数 SELECT ostrUserName=uName FROM uUser WHERE uId=intUserIdEND其中 CREATE PROC 语句(完整语句为CREATE PROCEDURE)的意思就是告诉SQL SERVER,现在需要建立一个存储过程,upGetUserName 就是存储过程名称,intUserId 和 ostrUserName 分别是该存储过程的两个参数,注意,在SQL SERVER中,所有用户定义的变量都以“”开头,OUTPUT关键字表示这个参数是用来输出的,AS之后就是存储过程内容了。只要将以上代码在“查询分析器”里执行一次,SQL SERVER就会在当前数据库中创建一个名为“upGetUserName”的存储过程。你可以打开“企业管理器”,选择当前操作的数据库,然后在左边的树型列表中选择“存储过程”,此时就可以在右边的列表中看到你刚刚创建的存储过程了(如果没有,刷新一下即可)。二、存储过程的调用之前我们已经创建了一个名为“upGetUserName”的存储过程,从字面理解该存储过程的功能是用来取得某一个用户的名称。存储过程建立好了,接下来就是要在应用程序里调用了,下面看一下在ASP程序里的调用。QUOTE:Dim adoComm/ 创建一个对象,我们用来调用存储过程Set adoComm = CreateObject(ADODB.Command)With adoComm / 设置连接,设 adoConn 为已经连接的 ADODB.Connection 对象 .ActiveConnection = adoConn / 类型为存储过程,adCmdStoredProc = 4 .CommandType = 4 / 存储过程名称 .CommandText = upGetUserName / 设置用户编号 .Parameters.Item(intUserId).Value = 1 / 执行存储过程 .Execute / 取得从存储过程返回的用户名称 Response.Write 用户名: & .Parameters.Item(ostrUserName).ValueEnd With/ 释放对象Set adoComm = Nothing通过以上两步,我们已经可以创建和使用简单的存储过程了。下面我们来看一个稍微复杂点的存储过程,以进一步了解存储过程的应用。三、存储过程的实际应用用户登录在ASP项目中经常会使用到,相信很多朋友也都做过类似的系统,但使用存储过程来做验证朋友可能不多,那么我们就以它来做例子,写一个简单的用户登录验证的存储过程。QUOTE:CREATE PROC upUserLoginstrLoginName NVARCHAR(20),strLoginPwd NVARCHAR(20),blnReturn BIT OUTPUTAS- 定义一个临时用来保存密码的变量DECLARE strPwd NVARCHAR(20)BEGIN - 从表中查询当前用户的密码,赋值给 strPwd 变量,下面要对他进行比较 SELECT strPwd=uLoginPwd FROM uUser WHERE uLoginName=strLoginName IF strLoginPwd = strPwd BEGIN SET blnReturn = 1 - 更新用户最后登录时间 UPDATE uUser SET uLastLogin=GETDATE() WHERE uLoginName=strLoginName END ELSE SET blnReturn = 0END用户登录的存储过程建立好了,现在在程序里试一下吧。注意,在一个区域内如果有多条语句时,必需使用BEGIN.END关键字。QUOTE:Dim adoComm/ 创建一个对象,我们用来调用存储过程Set adoComm = CreateObject(ADODB.Command)With adoComm / 设置连接,设 adoConn 为已经连接的 ADODB.Connection 对象 .ActiveConnection = adoConn / 类型为存储过程,adCmdStoredProc = 4 .CommandType = 4 / 存储过程名称 .CommandText = upUserLogin / 设置登录名称 .Parameters.Item(strLoginName).Value = admin / 设置登录密码 .Parameters.Item(strLoginPwd).Value = 123456 / 执行存储过程 .Execute / 判断是否登录成功 If .Parameters.Item(blnReturn).Value = 1 Then Response.Write 恭喜你,登录成功! Else Response.Write 不是吧,好像错了哦。 End IfEnd With/ 释放对象Set adoComm = Nothing通过以上的步骤,简单用户登录验证过程也做完了,现在只要把它整合到程序中就可以实现简单的用户登录验证了,关于其他细节就由你自己来处理了。上面介绍的两个存储过程都是只返回一个值的,下面我们来看一个返回一个记录集的存储过程。QUOTE:CREATE PROC upGetUserInfosintUserGroup INTASBEGIN - 从数据库中抽取符合条件的数据 SELECT uName,uGroup,uLastLogin FROM uUser WHERE uGroup=intUserGroup - 插入一列合计 UNION SELECT 合计人数:,COUNT(uGroup),NULL FROM uUser WHERE uGroup=intUserGroupEND现在我们来看一下ASP程序的调用。QUOTE:Dim adoCommDim adoRt/ 创建一个对象,我们用来调用存储过程Set adoComm = CreateObject(ADODB.Command)Set adoRs = CreateObject(ADODB.Recordset)With adoComm / 设置连接,设 adoConn 为已经连接的 ADODB.Connection 对象 .ActiveConnection = adoConn / 类型为存储过程,adCmdStoredProc = 4 .CommandType = 4 / 存储过程名称 .CommandText = upGetUserInfos / 设置用户组 .Parameters.Item(intUserGroup).Value = 1 / 执行存储过程,和以上几个例子不同,这里使用RecordSet的Open方法 adoRs.Open adoComm / 显示第一个值 Response.write adoRs.Fields(0).ValueEnd With/ 释放对象Set adoRs = NothingSet adoComm = Nothing怎么样,是不是也很简单呢,不过存储过程的用处不仅仅只有这些,他还有更强大的功能,比如使用游标、临时表来从多个表,甚至是多个数据库中调用数据,然后返回给用户,这些你可以在使用过程中慢慢的去发掘。好了,存储过程应用就先介绍到这里,如果你对本文有任何疑问,欢迎跟贴提出,我将尽力给予解答。下次我将给大家介绍触发器的应用。谢谢楼主,通过你的文章我看了前2个例子。不过我是用c#做的例子来调用,真是不公平,实在太随便了,调用真不负责任,感觉好像什么都可以乱调一样,太过分了!把我做的btn按钮代码发上来,参考哈:SqlConnection con = new SqlConnection(); con.ConnectionString = System.Configuration.ConfigurationSettings.AppSettingsDSN; con.Open(); string u_name=Server.HtmlEncode(TextBox1.Text); string u_pwd=Server.HtmlEncode(TextBox2.Text); SqlCommand cmdLogin = new SqlCommand(upUserLogin,con); cmdLogin.CommandType = CommandType.StoredProcedure; SqlParameter uname = new SqlParameter(strLoginName,SqlDbType.NVarChar,20 ); uname.Value=u_name; SqlParameter upwd = new SqlParameter(strLoginPwd,SqlDbType.NVarChar,20 ); upwd.Value=u_pwd; SqlParameter isOK = new SqlParameter(blnReturn,SqlDbType.Bit); isOK.Direction = ParameterDirection.Output; cmdLogin.Parameters.Add (uname); cmdLogin.Parameters.Add (upwd); cmdLogin.Parameters.Add (isOK); cmdLogin.ExecuteNonQuery (); bool a=System.Convert.ToBoolean( cmdLogin.ParametersblnReturn.Value.ToString (); if(a) Label1.Text=登录成功+欢迎您:+Server.HtmlEncode(TextBox1.Text); else Label1.Text=登录失败!; 前言 一直用ASP+ACCESS来编写网页和公司的内部应用系统,内部应用系统也就是大家说的OA吧,这个我也不知道,公司又叫它ERP,反正不管什么,它是用来帮助公司处理日常工作的,简化劳动的.从来没用过存储过程,所有的添加,删除,修改都是在ASP里面写程序执行,代码很多.数据量少的时候没什么感觉,挺快的,可等到数据量大的时候,上W条记录查询,尤其是不分页都显示在一页里的时候情况就出现了,速度很慢,要10几秒才有反应,所以想到了要用SQL的存储过程来简化代码和加快程序的执行速度! 在学习了51JS里的一篇教程SQL SERVER数据库开发之存储过程应用又在QQ里大侠的指导下终于有点入门,下边是我的学习笔记,有问题欢迎大家一起讨论! 1.ASP调用存储过程 首先在SQL里建立一个数据库叫it,怎么建我就不说了,这个简单,一看就知道了。然后在库里建个表,写几个数据记录,如下:cccr.jpg (134.95 KB) 2006-8-23 08:28cccr1.jpg (139.75 KB) 2006-8-23 08:28打开查询分析器,在里边写下如下语句点击绿色按钮执行它:t3.jpg (78.7 KB) 2006-8-23 08:28t4.jpg (74.28 KB) 2006-8-23 08:28你到数据库的存储过程里面看,已经多了一个名为upGetUserName的存储过程了表明已经成功的建立了存储过程,如果没有,试着刷新下t5.jpg (81.58 KB) 2006-8-23 08:28下面用ASP来调用它: CONN文件(连接数据库)如下: 复制内容到剪贴板 代码:54为SQL SERVER服务器的IP地址,uid pwd it 分别为连接数据库的用户和密码及所要连的数据库 新建一个index.asp文件,内容如下: 复制内容到剪贴板 代码:%set rs=server.createobject(adodb.recordset)sql = exec upGetUserNamers.open sql,db,3,2response.write rs.recordcount&while not rs.eof response.write rs(uname)&rs.movenextwendresponse.End%在浏览器中执行这个页面如果显示如下: t6.jpg (21.88 KB) 2006-8-23 08:28那么恭喜你,成功了! 上面是不带参数的存储过程调用,但我们在使用中一定会有参数的,下面就来介绍一个有参数的。 还是上边的例子,我们把原来的存储过程改成这样: 复制内容到剪贴板 代码:CREATE PROC upGetUserNameintUserId NVARCHAR(50),intUserpass NVARCHAR(50) ASBEGIN SELECT uname FROM users WHERE uId=intUserId and pass=intUserpassENDGO可以把原来的存储过程删除,然后把这个写在查询分析器里来执行,也可以直接在原来的存储过程里改。 intUserId NVARCHAR(50), intUserpass NVARCHAR(50) 是要传送进来的参数,是必须的,因为有两个,所以之间用“,”来分隔 index文件改成如下: 复制内容到剪贴板 代码:%set rs=server.createobject(adodb.recordset)sql = exec upGetUserName snake,snakers.open sql,db,3,2response.write rs.recordcount&while not rs.eof response.write rs(uname)&rs.movenextwendresponse.End%注意:sql = exec upGetUserName snake,snake 两个snake不是一个意思,一个是uid,一个是pass,存储过程返回的是uid=snake并且pass=snake的记录 数据库里只有一条这样的记录,所以会显示: t7.jpg (25.5 KB) 2006-8-23 08:28ASP 中调用存储过程、语法、写法sql server数据库 ASP与存储过程(Stored Procedures)的文章不少,但是我怀疑作者们是否真正实践过。我在初学时查阅过大量相关资料,发现其中提供的很多方法实际操作起来并不是那么回事。对于简单的应用,这些资料也许是有帮助的,但仅限于此,因为它们根本就是千篇一律,互相抄袭,稍微复杂点的应用,就全都语焉不详了。 现在,我基本上通过调用存储过程访问SQL Server,以下的文字虽不敢保证绝对正确,但都是实践的总结,希望对大家能有帮助。 存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。 定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQL Server)。如果我们通过创建存储过程以及在ASP中调用存储过程,就可以避免将SQL语句同ASP代码混杂在一起。这样做的好处至少有三个: 第一、大大提高效率。存储过程本身的执行速度非常快,而且,调用存储过程可以大大减少同数据库的交互次数。 第二、提高安全性。假如将SQL语句混合在ASP代码中,一旦代码失密,同时也就意味着库结构失密。 第三、有利于SQL语句的重用。 在ASP中,一般通过command对象调用存储过程,根据不同情况,本文也介绍其它调用方法。为了方便说明,根据存储过程的输入输出,作以下简单分类: 1. 只返回单一记录集的存储过程 假设有以下存储过程(本文的目的不在于讲述T-SQL语法,所以存储过程只给出代码,不作说明): /*SP1*/ CREATE PROCEDURE dbo.getUserList as set nocount on begin select * from dbo.userinfo end go 以上存储过程取得userinfo表中的所有记录,返回一个记录集。通过command对象调用该存储过程的ASP代码如下: *通过Command对象调用存储过程* DIM MyComm,MyRst Set MyComm = Server.CreateObject(ADODB.Command) MyComm.ActiveConnection = MyConStr MyConStr是数据库连接字串 MyComm.CommandText = getUserList 指定存储过程名 MyComm.CommandType = 4 表明这是一个存储过程 MyComm.Prepared = true 要求将SQL命令先行编译 Set MyRst = MyComm.Execute Set MyComm = Nothing 存储过程取得的记录集赋给MyRst,接下来,可以对MyRst进行操作。 在以上代码中,CommandType属性表明请求的类型,取值及说明如下: -1 表明CommandText参数的类型无法确定 1 表明CommandText是一般的命令类型 2 表明CommandText参数是一个存在的表名称 4 表明CommandText参数是一个存储过程的名称 还可以通过Connection对象或Recordset对象调用存储过程,方法分别如下: *通过Connection对象调用存储过程* DIM MyConn,MyRst Set MyConn = Server.CreateObject(ADODB.Connection) MyConn.open MyConStr MyConStr是数据库连接字串 Set MyRst = MyConn.Execute(getUserList,0,4) 最后一个参断含义同CommandType Set MyConn = Nothing *通过Recordset对象调用存储过程* DIM MyRst Set MyRst = Server.CreateObject(ADODB.Recordset) MyRst.open getUserList,MyConStr,0,1,4 MyConStr是数据库连接字串,最后一个参断含义与CommandType相同 2. 没有输入输出的存储过程 请看以下存储过程: /*SP2*/ CREATE PROCEDURE dbo.delUserAll as set nocount on begin delete from dbo.userinfo end go 该存储过程删去userinfo表中的所有记录,没有任何输入及输出,调用方法与上面讲过的基本相同,只是不用取得记录集: *通过Command对象调用存储过程* DIM MyComm Set MyComm = Server.CreateObject(ADODB.Command) MyComm.ActiveConnection = MyConStr MyConStr是数据库连接字串 MyComm.CommandText = delUserAll 指定存储过程名 MyComm.CommandType = 4 表明这是一个存储过程 MyComm.Prepared = true 要求将SQL命令先行编译 MyComm.Execute 此处不必再取得记录集 Set MyComm = Nothing 当然也可通过Connection对象或Recordset对象调用此类存储过程,不过建立Recordset对象是为了取得记录集,在没有返回记录集的情况下,还是利用Command对象吧。 3. 有返回值的存储过程 在进行类似SP2的操作时,应充分利用SQL Server强大的事务处理功能,以维护数据的一致性。并且,我们可能需要存储过程返回执行情况,为此,将SP2修改如下: /*SP3*/ CREATE PROCEDURE dbo.delUserAll as set nocount on begin BEGIN TRANSACTION delete from dbo.userinfo IF error=0 begin COMMIT TRANSACTION return 1 end ELSE begin ROLLBACK TRANSACTION return 0 end return end go 以上存储过程,在delete顺利执行时,返回1,否则返回0,并进行回滚操作。为了在ASP中取得返回值,需要利用Parameters集合来声明参数: *调用带有返回值的存储过程并取得返回值* DIM MyComm,MyPara Set MyComm = Server.CreateObject(ADODB.Command) MyComm.ActiveConnection = MyConStr MyConStr是数据库连接字串 MyComm.CommandText = delUserAll 指定存储过程名 MyComm.CommandType = 4 表明这是一个存储过程 MyComm.Prepared = true 要求将SQL命令先行编译 声明返回值 Set Mypara = MyComm.CreateParameter(RETURN,2,4) MyComm.Parameters.Append MyPara MyComm.Execute 取得返回值 DIM retValue retValue = MyComm(0) 或retValue = MyComm.Parameters(0) Set MyComm = Nothing 在MyComm.CreateParameter(RETURN,2,4)中,各参数的含义如下: 第一个参数(RETURE)为参数名。参数名可以任意设定,但一般应与存储过程中声明的参数名相同。此处是返回值,我习惯上设为RETURE; 第二个参数(2),表明该参数的数据类型,具体的类型代码请参阅ADO参考,以下给出常用的类型代码: adBigInt: 20 ; adBinary : 128 ; adBoolean: 11 ; adChar: 129 ; adDBTimeStamp: 135 ; adEmpty: 0 ; adInteger: 3 ; adSmallInt: 2 ; adTinyInt: 16 ; adVarChar: 200 ; 对于返回值,只能取整形,且-1到-99为保留值; 第三个参数(4),表明参数的性质,此处4表明这是一个返回值。此参数取值的说明如下: 0 : 类型无法确定; 1: 输入参数;2: 输入参数;3:输入或输出参数;4: 返回值 以上给出的ASP代码,应该说是完整的代码,也即最复杂的代码,其实 Set Mypara = MyComm.CreateParameter(RETURN,2,4) MyComm.Parameters.Append MyPara 可以简化为 MyComm.Parameters.Append MyComm.CreateParameter(RETURN,2,4) 甚至还可以继续简化,稍后会做说明。 对于带参数的存储过程,只能使用Command对象调用(也有资料说可通过Connection对象或Recordset对象调用,但我没有试成过)。 4. 有输入参数和输出参数的存储过程 返回值其实是一种特殊的输出参数。在大多数情况下,我们用到的是同时有输入及输出参数的存储过程,比如我们想取得用户信息表中,某ID用户的用户名,这时候,有一个输入参数-用户ID,和一个输出参数-用户名。实现这一功能的存储过程如下: /*SP4*/ CREATE PROCEDURE dbo.getUserName UserID int, UserName varchar(40) output as set nocount on begin if UserID is null return select UserName=username from dbo.userinfo where userid=UserID return end go 调用该存储过程的ASP代码如下: *调用带有输入输出参数的存储过程* DIM MyComm,UserID,UserName UserID = 1 Set MyComm = Server.CreateObject(ADODB.Command) MyComm.ActiveConnection = MyConStr MyConStr是数据库连接字串 MyComm.CommandText = getUserName 指定存储过程名 MyComm.CommandType = 4 表明这是一个存储过程 MyComm.Prepared = true 要求将SQL命令先行编译 声明参数 MyComm.Parameters.append MyComm.CreateParameter(UserID,3,1,4,UserID) MyComm.Parameters.append MyComm.CreateParameter(UserName,200,2,40) MyComm.Execute 取得出参 UserName = MyComm(1) Set MyComm = Nothing 在以上代码中,可以看到,与声明返回值不同,声明输入参数时需要5个参数,声明输出参数时需要4个参数。声明输入参数时5个参数分别为:参数名、参数数据类型、参数类型、数据长度、参数值。声明输出参数时,没有最后一个参数:参数值。 需要特别注意的是:在声明参数时,顺序一定要与存储过程中定义的顺序相同,而且各参数的数据类型、长度也要与存储过程中定义的相同。 如果存储过程有多个参数,ASP代码会显得繁琐,可以使用with命令简化代码: *调用带有输入输出参数的存储过程(简化代码)* DIM MyComm,UserID,UserName UserID = 1 Set MyComm = Server.CreateObject(ADODB.Command) with MyComm .ActiveConnection = MyConStr MyConStr是数据库连接字串 .CommandText = getUserName 指定存储过程名 .CommandType = 4 表明这是一个存储过程 .Prepared = true 要求将SQL命令先行编译 .Parameters.append .CreateParameter(UserID,3,1,4,UserID) .Parameters.append .CreateParameter(UserName,200,2,40) .Execute end with UserName = MyComm(1) Set MyComm = Nothing 假如我们要取得ID为1到10,10位用户的用户名,是不是要创建10次Command对象呢?不是的。如果需要多次调用同一存储过程,只需改变输入参数,就会得到不同的输出: *多次调用同一存储过程* DIM MyComm,UserID,UserName UserName = Set MyComm = Server.CreateObject(ADODB.Command) for UserID = 1 to 10 with MyComm .ActiveConnection = MyConStr MyConStr是数据库连接字串 .CommandText = getUserName 指定存储过程名 .CommandType = 4 表明这是一个存储过程 .Prepared = true 要求将SQL命令先行编译 if UserID = 1 then .Parameters.append .CreateParameter(UserID,3,1,4,UserID) .Parameters.append .CreateParameter(UserName,200,2,40) .Execute else 重新给入参赋值(此时参数值不发生变化的入参以及出参不必重新声明) .Parameters(UserID) = UserID .Execute end if end with UserName = UserName + MyComm(1) + , 也许你喜欢用数组存储 next Set MyComm = Nothing 通过以上代码可以看出:重复调用同一存储过程时,只需为值发生改变的输入参数重新赋值即可,这一方法在有多个输入输出参数,且每次调用时只有一个输入参数的值发生变化时,可以大大减少代码量。 5. 同时具有返回值、输入参数、输出参数的存储过程 前面说过,在调用存储过程时,声明参数的顺序要与存储过程中定义的顺序相同。还有一点要特别注意:如果存储过程同时具有返回值以及输入、输出参数,返回值要最先声明。 为了演示这种情况下的调用方法,我们改善一下上面的例子。还是取得ID为1的用户的用户名,但是有可能该用户不存在(该用户已删除,而userid是自增长的字段)。存储过程根据用户存在与否,返回不同的值。此时,存储过程和ASP代码如下: /*SP5*/ CREATE PROCEDURE dbo.getUserName -为了加深对顺序的印象,将以下两参数的定义顺序颠倒一下 UserName varchar(40) output, UserID int as set nocount on begin if UserID is null return select UserName=username from dbo.userinfo where userid=UserID if rowcount0 return 1 else return 0 return end go *调用同时具有返回值、输入参数、输出参数的存储过程* DIM MyComm,UserID,UserName UserID = 1 Set MyComm = Server.CreateObject(ADODB.Command) with MyComm .ActiveConnection = MyConStr MyConStr是数据库连接字串 .CommandText = get
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 跨境电商零售进口市场跨境电商平台品牌合作模式报告
- 建筑施工企业劳务派遣员工劳动合同规范集锦
- 现代学徒制建筑工程施工管理人才培养协议
- 用电安全与租赁合同范本(适用于青年公寓租赁)
- 智能制造产业股权转移及技术创新合同范本
- 离婚协议书范本:夫妻共同债务处理与子女教育协议
- 带有商业用途的二手房买卖及租金收益权合同
- 生态园区物业管理经营权移交及转让合同模板
- 国际贸易合同签订与汇率风险控制协议
- 离异家庭子女监护权变更及财产分配执行协议
- 电力系统分析基础教案-按课时
- 台达伺服asda-b2系列技术手册
- 云南省三校生语文课件
- 园艺产品的主要贮藏方法与原理课件
- 社会及其构成要素
- 环境风险评价(共84张)课件
- 函数极限说课
- 农业经济学ppt全套教学课件
- 果蔬贮藏保鲜概论:第五章 采收与采后商品化处理(第2节 分级 Sorting)
- 弱电桥架安装及电缆敷设施工方案(PPT)
- FQFNew8.0+供应商自审表格使用手册
评论
0/150
提交评论