日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL server 存储过程的建立和调用

發布時間:2024/4/17 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL server 存储过程的建立和调用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 存储过程的建立和调用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。