SQL server 存储过程的建立和调用
存储过程的建立和调用
--1.1准备测试需要的数据库:test,数据表:物料表,采购表
if not exists (select * from master.dbo.sysdatabases where name='test')
create database test
go
use test
go

if object_id('test..物料表') is null
begin
create table 物料表(编号 varchar(6),名称 varchar(40),类别 varchar(20))

insert into 物料表
select 'A00001','46寸电视机','电视机' union all
select 'A00002','52寸电视机','电视机' union all
select 'A00003','60寸电视机','电视机' union all
select 'A00004','39寸电视机','电视机' union all
select 'A00005','16升洗衣机','洗衣机' union all
select 'A00007','美的1匹空调','空调' union all
select 'A00008','格力1匹空调','空调'

select * from 物料表
end

if object_id('test..采购表') is null
begin
create table 采购表(编号 varchar(6),名称 varchar(40),单价 numeric(10,2),数量 int,小计 numeric(10,2),日期 datetime)

insert into 采购表
select 'A00001','46寸电视机',5000.00,10,5000*10,'2016-10-01' union all
select 'A00002','52寸电视机',5500.00,20,5500*20,'2016-10-02' union all
select 'A00003','60寸电视机',6500.00,10,6500*10,'2016-10-03' union all
select 'A00004','39寸电视机',3000.00,10,3000*10,'2016-10-04' union all
select 'A00005','16升洗衣机',1500.00,10,1500*10,'2016-10-04' union all
select 'A00007','美的1匹空调',2500.00,20,2500*20,'2016-10-05' union all
select 'A00008','格力1匹空调',2800.00,10,2800*10,'2016-10-05'

select * from 采购表
end

--1.2 建立1个修改物料表名称的存储过程,同时更新采购表名称(注意:建立存储过程的语句,要单独分开执行,即不能和上面建立测试环境的语句在一起)
create proc dbo.update_wl(@bh varchar(6),@mc varchar(40),@ut int output)
as
begin
declare @rs int
set @ut=1
begin transaction

update 物料表 set 名称=@mc where 编号=@bh
set @ut=@@rowcount
if @ut> 0 --@@rowcount为系统变量,影响行数,大于0表示更新成功,同步采购表
beginif exists(select 编号 from 采购表 where 编号=@bh) --如果采购表存在改编号记录,同步begin   update 采购表 set 名称=@mc where 编号=@bhset @ut=@@rowcount  --如果同步成功,必定返回大于0值end
endif @ut > 0 commit
elserollback transaction

end

--1.3 在SQL2000 中的调用方法
declare @bh varchar(6),@mc varchar(40),@ut int
set @bh='a00002'
set @mc='49寸电视机'

exec update_wl @bh,@mc,@ut output
select @ut
select * from 物料表
select * from 采购表

--只增加1个物料,采购没数据
--insert into 物料表
--select 'A00009','美的2匹空调','空调'

set @bh='a00009'
set @mc='美的2匹空调'

exec update_wl @bh,@mc,@ut output
select @ut
select * from 物料表
select * from 采购表

dbo.update_wl(@bh varchar(6),@mc varchar(40),@ut int output)
这个存储过程,是带参数返回值的,如果返回值大于0,表示更新成功。
相当执行了2条命令
update 物料表 set 名称=@mc where 编号=@bh
update 采购表 set 名称=@mc where 编号=@bh
但用存储过程,使用了事务,当2条语句都成功执行时,才都执行,要是第2条,没成功执行时,会回滚

**在VFP中调用
local bh,mc,ut
bh='A00002'
mc='49寸电视机'
ut=0
sqlexec(句柄,'exec update_wl ?bh,?mc,?@ut')
?ut &&查看返回值,0为没更新,大于0为更新

-- SQL2000中调用,'B00002'是物料表中没有的,此时,返回值 0
declare @bh varchar(6),@mc varchar(40),@ut int
set @bh='B00002'
set @mc='49寸电视机'

exec update_wl @bh,@mc,@ut output
select @ut
select * from 物料表
select * from 采购表

-- 1.4 存在过程的修改,在SQL2000中进行,把 create 改为 alter 就可以。
alter proc dbo.update_wl(@bh varchar(6),@mc varchar(40),@ut int output)
as
begin
declare @rs int --此行多余
set @ut=1
begin transaction

 update 物料表 set 名称=@mc where 编号=@bhset @ut=@@rowcountif @ut> 0 --@@rowcount为系统变量,影响行数,大于0表示更新成功,同步采购表
beginif exists(select 编号 from 采购表 where 编号=@bh) --如果采购表存在改编号记录,同步begin   update 采购表 set 名称=@mc where 编号=@bhset @ut=@@rowcount  --如果同步成功,必定返回大于0值endendif @ut > 0 commitelserollback transaction

end

** 1.5 在VFP中,创建SQL2000的存储过程
TEXT TO lcSqlStr TEXTMERGE NOSHOW PRETEXT 4
create proc dbo.update_wl(@bh varchar(6),@mc varchar(40),@ut int output)
as
begin
declare @rs int --此行多余
set @ut=1

begin transactionupdate 物料表 set 名称=@mc where 编号=@bhset @ut=@@rowcountif @ut> 0 --@@rowcount为系统变量,影响行数,大于0表示更新成功,同步采购表
beginif exists(select 编号 from 采购表 where 编号=@bh) --如果采购表存在改编号记录,同步begin   update 采购表 set 名称=@mc where 编号=@bhset @ut=@@rowcount  --如果同步成功,必定返回大于0值endendif @ut > 0 commitelserollback transaction

end
ENDTEXT
?SQLEXEC(句柄,lcSqlStr)
**就这么简单

LOCAL lcSql,lcServer,lcUid,lcPwd,lcPwd,lnHandle

lcServer = "atm8505"
lcUid = "sa"
lcPwd = "123456"
lcDbs = "test"
**把上面的参数,改为你自己的

lcSql=[driver=sql server;server=] + lcServer + [;uid=] + lcUid + [;pwd=] + lcPwd + [;database=] + lcDbs
lnHandle=sqlstringconnect(lcSql)

LOCAL bh,mc,ut
bh='A00002'
mc='49寸电视机'
ut=0

IF lnHandle > 0
?ut && 输出 0
SQLEXEC(lnHandle,'exec update_wl ?bh,?mc,?@ut')
?ut && 更新成功,输出大于1
ENDIF

*还有1种调用,用 call

IF lnHandle > 0
?ut && 输出 0
SQLEXEC(lnHandle,"{call update_wl(?bh,?mc,?@ut)}")
?ut && 更新成功,输出大于1
ENDIF

原文地址https://www.cnblogs.com/liu224/p/10736111.html

SQL server 存储过程的建立和调用相关推荐

  1. java调用存储过程 sql server_Java中调用SQL Server存储过程示例

    Java中调用SQL Server存储过程示例2007-09-03 08:48来源:论坛整理作者:孟子E章责任编辑:方舟·yesky评论(3) 最近做了个Java的小项目(第一次写Java的项目哦), ...

  2. Microsoft SQL Server 存储过程

    Microsoft SQL Server 存储过程 TRIGGER DDL触发器:主要用于防止对数据库架构.视图.表.存储过程等进行的某些修改:DDL事件是指对数据库CREATE,ALTER,DROP ...

  3. db2 删除存储过程_数据库教程-SQL Server存储过程使用及异常处理

    SQL Server存储过程 存储过程(Procedure)是数据库重要对象之一,也是数据库学习的重点之一.本文,我们以SQL Server为例对存储过程的概念.定义.调用.删除及存储过程调用异常等通 ...

  4. SQL Server 存储过程中使用raiserror抛出异常

    转自(SQL Server 存储过程中使用raiserror抛出异常 ) 一 系统预定义错误代码 SQL Server 有3831个预定义错误代码,由master.dbo.sysmessages 表维 ...

  5. sql server存储过程修改,存储到mysql笔记

    由于有些项目要迁移到mysql上,数据迁移用MySQLWorkbench就能很好的迁移,最难的是存储过程之类的. 下面是sql server存储过程和mysql存储过程的转化: SQL SERVER: ...

  6. sql server存储过程基本写法

    sql server存储过程的优点 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 2.当对数据 ...

  7. SQL Server存储过程输入参数使用表值

    在2008之前如果我们想要将表作为输入参数传递给SQL Server存储过程使比较困难的,可能需要很多的逻辑处理将这些表数据作为字符串或者XML传入. 在2008中提供了表值参数.使用表值参数,可以不 ...

  8. SQL Server存储过程里全库查找引用的数据库对象(表、存储过程等)

    SQL Server存储过程全库匹配数据库对象(表.存储过程等) 简介 可以通过自定义存储过程sp_eachdb来遍历每个数据库然后结合sys.objects 关联sys.sql_modules后的d ...

  9. SQL Server存储过程中使用表值作为输入参数示例

    这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...

最新文章

  1. Lintcode189 First Missing Positive solution 题解
  2. D - ABC Conjecture Gym - 102798D
  3. Linux系统Shutdown命令定时关机详解
  4. 前端学习(1848)vue之电商管理系统电商系统的开发模式和技术选型
  5. 微信正则表达式 iOS
  6. hadoop单击模式环境搭建
  7. Python进阶-----类的内置方法__getattribute__
  8. 美萍车辆业务管理系统
  9. 解决 未能为数据库 '数据库用户名' 中的对象 '表名' 分配空间,因为文件组 'PRIMARY' 已满...
  10. python定位地理位置_python 实现ip定位地址
  11. java 问题 无法解析类型 java.lang.CharSequence。从必需的 .class 文件间接引用了它
  12. 什么是bypass(转载)
  13. cmos电路多余输入端能否悬空_CMOS电路多余输入端悬空,会造成逻辑混乱,该如何处理?...
  14. 【ITool】js多个页面传值
  15. 仿淘宝 阿里云登录 密码和扫码切换登录
  16. 1088: 手机短号 (多实例) ZZULIOJ
  17. 在Ubuntu18.04 LTS下升级Python版本
  18. 数据分析之Quick bi
  19. 最短路 HDU - 2544 (最短路)
  20. 哆啦A梦的超级计算机,哆啦A梦的体内究竟有什么?其实你真的低估了这个蓝胖子...

热门文章

  1. 轻松使用zstd来解压缩
  2. Kafka配置offsets.retention.minutes和log.retention.minutes的区别
  3. mysql 的 外连查询
  4. c++ 9.程序流程结构
  5. 第1章 计算机系统概述小节
  6. 8086汇编-实验10-字符打印程序
  7. docker 安装git_docker随手笔记第十二节 jenkins+docker+nginx+纯静态页面配置
  8. How-to: Use the ShareLib in Apache Oozie
  9. 常见的天气现象有哪些
  10. 转:【Python3网络爬虫开发实战】6.4-分析Ajax爬取今日头条街拍美图