SQL server 存儲過程的建立和調用

来源:https://www.cnblogs.com/liu224/archive/2019/04/19/10736111.html
-Advertisement-
Play Games

存儲過程的建立和調用 --1.1準備測試需要的資料庫:test,數據表:物料表,採購表if not exists (select * from master.dbo.sysdatabases where name='test')create database testgouse testgoif o ...


 存儲過程的建立和調用

--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表示更新成功,同步採購表
    begin
      if exists(select 編號 from 採購表 where 編號=@bh) --如果採購表存在改編號記錄,同步
      begin   
        update 採購表 set 名稱=@mc where 編號=@bh
        set @ut=@@rowcount  --如果同步成功,必定返回大於0值
      end
    end
  
    if @ut > 0 
     commit
    else
     rollback 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 編號=@bh
     set @ut=@@rowcount
     if @ut> 0 --@@rowcount為系統變數,影響行數,大於0表示更新成功,同步採購表
    begin
       if exists(select 編號 from 採購表 where 編號=@bh) --如果採購表存在改編號記錄,同步
      begin   
         update 採購表 set 名稱=@mc where 編號=@bh
         set @ut=@@rowcount  --如果同步成功,必定返回大於0值
      end
     end
   
     if @ut > 0 
      commit
     else
      rollback 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 transaction
      update 物料表 set 名稱=@mc where 編號=@bh
      set @ut=@@rowcount
      if @ut> 0 --@@rowcount為系統變數,影響行數,大於0表示更新成功,同步採購表
    begin
        if exists(select 編號 from 採購表 where 編號=@bh) --如果採購表存在改編號記錄,同步
      begin   
          update 採購表 set 名稱=@mc where 編號=@bh
          set @ut=@@rowcount  --如果同步成功,必定返回大於0值
      end
      end
    
      if @ut > 0 
       commit
      else
       rollback 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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • fdisk 常用的磁碟分區工具,受mbr分區表的限制,只能給小於2TB的磁碟劃分分區,如果使用fdisk對大於2TB的磁碟進行分區,雖然可以分區,但只能識別2T的空間,一般使用parted分區工具 -l # 顯示所有磁碟分區信息 Device # 分區名稱 Boot # 啟動分區,用*表示的是啟動分 ...
  • 編輯器之神-vim,在Linux下編輯代碼的vim的使用,基本上包括了vim的常用各種命令,vi的三種模式,編輯保存,複製粘貼,查找替換,移動跳轉,撤銷反撤銷等等 ...
  • 刪除原有的yum源: 重新下載阿裡雲的yum源: wget -O 可自行百度 列出yum各軟體包: 清除緩存: 如果沒安裝wget ,yum也還沒配置好,可以直接瀏覽器下載後上傳至/etc/yum.repos.d 並改名為 CentOS-Base.repo ...
  • 1.啟動虛擬機,出現下麵倒計時界面時,按e鍵。進入啟動前編輯。 2.進入如下界面,再按e鍵。 3.進入如下頁面後,選中第二項kernel開頭的項,選中後再按e鍵。 4.進入如下界面後,在最後面輸入空格和s,然後回車。 5.回到如下界面後,按b鍵(boot啟動的意思) 進入如下頁面。 7.在最後的位置 ...
  • 一. Percona XtraBackup 的優點。 (1)無需停止資料庫進行InnoDB熱備; (2)增量備份MySQL; (3)流壓縮傳輸到其它伺服器; (4)線上移動表; (5)能夠比較容易地創建主從同步; (6)備份MySQL時不會增大伺服器負載。 二. Percona XtraBackup ...
  • 背景 從mysql.slow_log 獲取慢查詢日誌很慢,該表是csv表,沒有索引。 想添加索引來加速訪問,而csv引擎不能添加索引(csv引擎存儲是以逗號分割的文本來存儲的),只能改存儲引擎來添加索引了 MySQL 中日誌表slow_log和general_log主要特點 日誌表只能是CSV和MY ...
  • DMLinsert關鍵字作用:往表中插入一條(多條)數據語法1:元祖值式的插入語法1: insert into tablename(column1,column2,...,columnN) values(value1,value2,...,valueN); insert into 表名 (列1 ,列 ...
  • 前言 關於索引,這是一個非常重要的知識點,同樣,在面試的時候也會被經常的問到; 本文描述了索引的結構,介紹了InnoDB的索引方案等知識點,感興趣的可以看一下; 引入 本文參考文章:MySQL的索引 回顧 在上篇文章中我們說到 InnoDB的數據頁結構 ,瞭解到了 數據頁的 7 個組成部分,知道了各 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...