當前位置:首頁 » 服務存儲 » 怎麼創建存儲結果
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

怎麼創建存儲結果

發布時間: 2023-01-18 00:53:06

Ⅰ mysql中如何創建存儲過程

-- 創建存儲過程DELIMITER $ --聲明存儲過程的結束符

CREATE PROCEDURE stu_test() --存儲過程名稱(參數列表)

BEGIN --開始 -- 可以寫多個sql語句 -- sql語句+流程式控制制

END $ --結束 結束符

-- 執行存儲過程call stu_test() --call 存儲過程名稱(參數)

參數:IN: 表示輸入參數,可以攜帶數據帶存儲過程中
OUT: 表示輸出參數,可以從存儲過程中返回結果
INOUT: 表示輸入輸出參數,兩者結合


Ⅱ sqlserver怎麼創建存儲過程

什麼是存儲過程?
q 存儲過程(procere)類似於C語言中的函數
q 用來執行管理任務或應用復雜的業務規則
q 存儲過程可以帶參數,也可以返回結果
q 存儲過程可以包含數據操縱語句、變數、邏輯 控制語句等

存儲過程的優點
(1)執行速度快。
存儲過程創建是就已經通過語法檢查和性能優化,在執行時無需每次編譯。
存儲在資料庫伺服器,性能高。
(2)允許模塊化設計。
只需創建存儲過程一次並將其存儲在資料庫中,以後即可在程序中調用該過程任意次。存儲過程可由在資料庫編程方面有專長的人員創建,並可獨立於程序源代碼而單獨修改 。
(3)提高系統安全性。
可將存儲過程作為用戶存取數據的管道。可以限制用戶對數據表的存取許可權,建立特定的存儲過程供用戶使用,完成對數據的訪問
存儲過程的定義文本可以被加密,使用戶不能查看其內容。
(4)減少網路流量:
一個需要數百行Transact-SQL代碼的操作由一條執行過程代碼的單獨語句就可實現,而不需要在網路中發送數百行代碼。

存儲過程的分類
q 系統存儲過程
q 由系統定義,存放在master資料庫中
q 類似C語言中的系統函數
q 系統存儲過程的名稱都以「sp_」開頭或」xp_」開頭
q 用戶自定義存儲過程
q 由用戶在自己的資料庫中創建的存儲過程
q 類似C語言中的用戶自定義函數

常用的系統存儲過程

系統存儲過程

說明

sp_databases

列出伺服器上的所有資料庫。

sp_helpdb

報告有關指定資料庫或所有資料庫的信息

sp_renamedb

更改資料庫的名稱

sp_tables

返回當前環境下可查詢的對象的列表

sp_columns

回某個表列的信息

sp_help

查看某個表的所有信息

sp_helpconstraint

查看某個表的約束

sp_helpindex

查看某個表的索引

sp_stored_proceres

列出當前環境中的所有存儲過程。

sp_password

添加或修改登錄帳戶的密碼。

sp_helptext

顯示默認值、未加密的存儲過程、用戶定義的存儲過程、觸發器或視圖的實際文本。

EXEC sp_databases /*列出當前系統中的資料庫*/
EXEC sp_renamedb 'Northwind','Northwind1' /*修改資料庫的名稱(單用戶訪問, 最簡單的辦法就是執行SQL語句時關掉企業管理器)*/
USE stuDB
GO
EXEC sp_tables /*當前資料庫中查詢的對象的列表*/
EXEC sp_columns stuInfo /*返回某個表列的信息*/
EXEC sp_help stuInfo /*查看錶stuInfo的信息*/
EXEC sp_helpconstraint stuInfo /*查看錶stuInfo的約束*/
EXEC sp_helpindex stuMarks /*查看錶stuMarks的索引*/
EXEC sp_helptext 'view_stuInfo_stuMarks' /*查看視圖的語句文本*/
EXEC sp_stored_proceres /*查看當前資料庫中的存儲過程*/

常用的擴展存儲過程
q 常用的擴展存儲過程:xp_cmdshell
q 可以執行DOS命令下的一些的操作
q 以文本行方式返回任何輸出
q 調用語法:
q EXEC xp_cmdshell DOS命令 [NO_OUTPUT]
USE master
GO
EXEC xp_cmdshell 'mkdir d:/bank', NO_OUTPUT /*創建文件夾D:/bank*/
IF EXISTS(SELECT * FROM sysdatabases
WHERE name='bankDB')
DROP DATABASE bankDB
GO
CREATE DATABASE bankDB
(

)
GO
EXEC xp_cmdshell 'dir D:/bank/' --查看文件 /*查看文件夾D:/bank*/

如何創建存儲過程?
q 定義存儲過程的語法
CREATE PROC[EDURE] 存儲過程名
@參數1 數據類型 = 默認值,
…… ,
@參數n 數據類型 OUTPUT
AS
SQL語句
GO
q 和C語言的函數一樣,參數可選
q 參數分為輸入參數、輸出參數
q 輸入參數允許有默認值

創建不帶參數的存儲過程
CREATE PROCEDURE proc_stu /* proc_stu為存儲過程的名稱*/
AS
DECLARE @writtenAvg float,@labAvg float /* 筆試平均分和機試平均分變數 */
SELECT @writtenAvg=AVG(writtenExam),
@labAvg=AVG(labExam) FROM stuMarks
print '筆試平均分:'+convert(varchar(5),@writtenAvg)
print '機試平均分:'+convert(varchar(5),@labAvg)
IF (@writtenAvg>70 AND @labAvg>70)
print '本班考試成績:優秀' /* 顯示考試成績的等級 */
ELSE
print '本班考試成績:較差'
print '--------------------------------------------------'
print ' 參加本次考試沒有通過的學員:'
SELECT stuName,stuInfo.stuNo,writtenExam,labExam /* 顯示未通過的學員 */
FROM stuInfo INNER JOIN stuMarks ON
stuInfo.stuNo=stuMarks.stuNo
WHERE writtenExam<60 OR labExam<60
GO

調用存儲過程
q EXECUTE(執行)語句用來調用存儲過程
q 調用的語法
EXEC 過程名 [參數]

創建帶參數的存儲過程
q 存儲過程的參數分兩種:
q 輸入參數
q 輸出參數
q 輸入參數:
用於向存儲過程傳入值,類似C語言的按值傳遞;
q 輸出參數:
用於在調用存儲過程後,
返回結果,類似C語言的
按引用傳遞;

帶輸入參數的存儲過程
問題:
修改上例:由於每次考試的難易程度不一樣,每次 筆試和機試的及格線可能隨時變化(不再是60分),這導致考試的評判結果也相應變化。

分析:
在述存儲過程添加2個輸入參數:
@writtenPass 筆試及格線
@labPass 機試及格線
CREATE PROCEDURE proc_stu
@writtenPass int = 60, /*輸入參數:筆試及格線*/
@labPass int = 60 /*輸入參數:機試及格線*/
AS
print '--------------------------------------------------'
print ' 參加本次考試沒有通過的學員:'
SELECT stuName,stuInfo.stuNo,writtenExam, /*查詢沒有通過考試的學員*/
labExam FROM stuInfo
INNER JOIN stuMarks ON
stuInfo.stuNo=stuMarks.stuNo
WHERE writtenExam<@writtenPass
OR labExam<@labPass
GO
q 調用帶參數的存儲過程
假定本次考試機試偏難,機試的及格線定為55分,筆試及格線定為60分
EXEC proc_stu 60,55
--或這樣調用:
EXEC proc_stu @labPass=55,@writtenPass=60

帶輸出參數的存儲過程
q 如果希望調用存儲過程後,返回一個或多個值,這時就需要使用輸出(OUTPUT)參數了
問題:
修改上例,返回未通過考試的學員人數。
CREATE PROCEDURE proc_stu
@notpassSum int OUTPUT, /*輸出(返回)參數:表示沒有通過的人數*/
@writtenPass int=60, /*推薦將默認參數放在最後*/
@labPass int=60
AS
……
SELECT stuName,stuInfo.stuNo,writtenExam, /*統計並返回沒有通過考試的學員人數*/
labExam FROM stuInfo INNER JOIN stuMarks
ON stuInfo.stuNo=stuMarks.stuNo
WHERE writtenExam<@writtenPass
OR labExam<@labPass
SELECT @notpassSum=COUNT(stuNo)
FROM stuMarks WHERE writtenExam<@writtenPass
OR labExam<@labPass
GO
q 調用帶輸出參數的存儲過程
/*---調用存儲過程----*/
DECLARE @sum int /*調用時必須帶OUTPUT關鍵字 ,返回結果將存放在變數@sum中*/
EXEC proc_stu @sum OUTPUT ,64
print '--------------------------------------------------'
IF @sum>=3 /*後續語句引用返回結果*/
print '未通過人數:'+convert(varchar(5),@sum)+ '人,
超過60%,及格分數線還應下調'
ELSE
print '未通過人數:'+convert(varchar(5),@sum)+ '人,
已控制在60%以下,及格分數線適中'
GO
注意:調用時也必須跟隨關鍵字OUTPUT,否則SQL Server將視為輸入參數。

處理存儲過程中的錯誤
q 可以使用PRINT語句顯示錯誤信息,但這 些信息是臨時的,只能顯示給用戶
q RAISERROR 顯示用戶定義的錯誤信息時
q 可指定嚴重級別,
q 設置系統變數@@ERROR
q 記錄所發生的錯誤等
q RAISERROR語句的用法如下:
RAISERROR (msg_id | msg_str,severity,
state WITH option[,...n]])
• msg_id:在sysmessages系統表中指定用戶定義錯誤信息
• msg_str:用戶定義的特定信息,最長255個字元
• severity:定義嚴重性級別。用戶可使用的級別為0–18級
• state:表示錯誤的狀態,1至127之間的值
• option:指示是否將錯誤記錄到伺服器錯誤日誌中
RAISERROR 語句每個參數的詳細講解,可以查閱SQL幫助!
問題:
完善上例,當用戶調用存儲過程時,傳入的及格線參數不
在0~100之間時,將彈出錯誤警告,終止存儲過程的執行。
CREATE PROCEDURE proc_stu
@notpassSum int OUTPUT, --輸出參數
@writtenPass int=60, --默認參數放後
@labPass int=60 --默認參數放後
AS
IF (NOT @writtenPass BETWEEN 0 AND 100)
OR (NOT @labPass BETWEEN 0 AND 100)
/*引發系統錯誤,指定錯誤的嚴重級別16,調用狀態為1(默認),並影響@@ERROR系統變數的值 */
BEGIN
RAISERROR (『及格線錯誤,請指定0-100之間的分
數,統計中斷退出',16,1)
RETURN ---立即返回,退出存儲過程
END
…..其他語句同上例,略
GO
/*---調用存儲過程,測試RAISERROR語句----*/
DECLARE @sum int, @t int
EXEC proc_stu @sum OUTPUT ,604 /*筆試及格線誤輸入604分*/
SET @t=@@ERROR
print '錯誤號:'+convert(varchar(5),@t )
IF @t<>0 /*如果執行了RAISERROR,系統全局@@ERROR將不等於0,表示出現錯誤*/
RETURN --退出批處理,後續語句不再執行
print '--------------------------------------------------'
IF @sum>=3
print '未通過人數:'+convert(varchar(5),@sum)+ '人,超過60%,及格分數線還應下調'
ELSE
print '未通過人數:'+convert(varchar(5),@sum)+ '人,已控制在60%以下,及格分數線適中'
GO

好,我們來做個總結:
• 存儲過程是一組預編譯的SQL語句,它可以包含數據操縱語句、變數、邏輯控制語句等
• 存儲過程允許帶參數,參數分為:
– 輸入參數
– 輸出參數
其中,輸入參數可以有默認值。
• 輸入參數:可以在調用時向存儲過程傳遞參數,此類參數可用來向存儲過程中傳入值
• 輸出參數從存儲過程中返回(輸出)值,後面跟隨OUTPUT關鍵字
• RAISERROR語句用來向用戶報告錯誤

Ⅲ 創建存儲過程sql語句

1)過程名
存儲過程的名稱,默認在當前資料庫中創建。若需要在特定資料庫中創建存儲過程,則要在名稱前面加上資料庫的名稱,即db_name.sp_name。
需要注意的是,名稱應當盡量避免選取與MySQL內置函數相同的名稱,否則會發生錯誤。
2)過程參數
存儲過程的參數列表。其中,<參數名>為參數名,<類型>為參數的類型(可以是任何有效的MySQL數據類型)。當有多個參數時,參數列表中彼此間用逗號分隔。存儲過程可以沒有參數(此時存儲過程的名稱後仍需加上一對括弧),也可以有1個或多個參數。
MySQL存儲過程支持三種類型的參數,即輸入參數、輸出參數和輸入/輸出參數,分別用IN、OUT和INOUT三個關鍵字標識。其中,輸入參數可以傳遞給一個存儲過程,輸出參數用於存儲過程需要返回一個操作結果的情形,而輸入/輸出參數既可以充當輸入參數也可以充當輸出參數。

Ⅳ sqlserver怎麼創建存儲過程

第一步:點擊資料庫下的「可編程性」,選擇「存儲過程」,點擊滑鼠右鍵,選擇「新建存儲過程」

注意事項:

注意執行exec時,參數的類型,要與建立的存儲過程時設置的參數類型一致。

Ⅳ sqlserver怎麼創建存儲過程

1、可視化創建

a.登錄SQL Server

b.打開資料庫==》要創建存儲過程的資料庫==》可編程性==》存儲過程

c.選中「存儲過程」右擊 ,在系出現的對話框中選擇「新建存儲過程」

d.在右側出現的對話框中填寫具體存儲過程內容完成後執行即可

2、代碼創建

a.全手寫代碼

一、定義變數
--簡單賦值
declare@aint
set@a=5
print@a

--使用select語句賦值
declare@user1nvarchar(50)
select@user1='張三'
print@user1
declare@user2nvarchar(50)
select@user2=NamefromST_UserwhereID=1
print@user2

--使用update語句賦值
declare@user3nvarchar(50)
updateST_Userset@user3=NamewhereID=1
print@user3


二、表、臨時表、表變數

--創建臨時表1
createtable#DU_User1
(
[ID][int]NOTNULL,
[Oid][int]NOTNULL,
[Login][nvarchar](50)NOTNULL,
[Rtx][nvarchar](4)NOTNULL,
[Name][nvarchar](5)NOTNULL,
[Password][nvarchar](max)NULL,
[State][nvarchar](8)NOTNULL
);
--向臨時表1插入一條記錄
insertinto#DU_User1(ID,Oid,[Login],Rtx,Name,[Password],State)values(100,2,'LS','0000','臨時','321','特殊');

--從ST_User查詢數據,填充至新生成的臨時表
select*into#DU_User2fromST_UserwhereID<8

--查詢並聯合兩臨時表
select*from#DU_User2whereID<3unionselect*from#DU_User1

--刪除兩臨時表
droptable#DU_User1
droptable#DU_User2

--創建臨時表
CREATETABLE#t
(
[ID][int]NOTNULL,
[Oid][int]NOTNULL,
[Login][nvarchar](50)NOTNULL,
[Rtx][nvarchar](4)NOTNULL,
[Name][nvarchar](5)NOTNULL,
[Password][nvarchar](max)NULL,
[State][nvarchar](8)NOTNULL,
)

--將查詢結果集(多條數據)插入臨時表
insertinto#tselect*fromST_User
--不能這樣插入
--select*into#tfromdbo.ST_User

--添加一列,為int型自增長子段
altertable#tadd[myid]intNOTNULLIDENTITY(1,1)
--添加一列,默認填充全球唯一標識
altertable#tadd[myid1](newid())

select*from#t
droptable#t
--給查詢結果集增加自增長列

--無主鍵時:
selectIDENTITY(int,1,1)asID,Name,[Login],[Password]into#tfromST_User
select*from#t

--有主鍵時:
select(selectSUM(1)fromST_UserwhereID<=a.ID)asmyID,*fromST_UseraorderbymyID
--定義表變數
declare@ttable
(
idintnotnull,
msgnvarchar(50)null
)
insertinto@tvalues(1,'1')
insertinto@tvalues(2,'2')
select*from@t
三、循環

--while循環計算1到100的和
declare@aint
declare@sumint
set@a=1
set@sum=0
while@a<=100
begin
set@sum+=@a
set@a+=1
end
print@sum
四、條件語句

--if,else條件分支
if(1+1=2)
begin
print'對'
end
else
begin
print'錯'
end

--whenthen條件分支
declare@todayint
declare@weeknvarchar(3)
set@today=3
set@week=case
when@today=1then'星期一'
when@today=2then'星期二'
when@today=3then'星期三'
when@today=4then'星期四'
when@today=5then'星期五'
when@today=6then'星期六'
when@today=7then'星期日'
else'值錯誤'
end
print@week


五、游標

declare@IDint
declare@Oidint
declare@Loginvarchar(50)

--定義一個游標
declareuser_curcursorforselectID,Oid,[Login]fromST_User
--打開游標
openuser_cur
while@@fetch_status=0
begin
--讀取游標
fetchnextfromuser_curinto@ID,@Oid,@Login
print@ID
--print@Login
end
closeuser_cur
--摧毀游標
deallocateuser_cur
六、觸發器

觸發器中的臨時表:

Inserted
存放進行insert和update操作後的數據
Deleted
存放進行delete和update操作前的數據

--創建觸發器
CreatetriggerUser_OnUpdate
OnST_User
forUpdate
As
declare@msgnvarchar(50)
--@msg記錄修改情況
select@msg=N'姓名從「'+Deleted.Name+N'」修改為「'+Inserted.Name+'」'fromInserted,Deleted
--插入日誌表
insertinto[LOG](MSG)values(@msg)

--刪除觸發器
droptriggerUser_OnUpdate
七、存儲過程

--創建帶output參數的存儲過程
CREATEPROCEDUREPR_Sum
@aint,
@bint,
@sumintoutput
AS
BEGIN
set@sum=@a+@b
END

--創建Return返回值存儲過程
CREATEPROCEDUREPR_Sum2
@aint,
@bint
AS
BEGIN
Return@a+@b
END

--執行存儲過程獲取output型返回值
declare@mysumint
executePR_Sum1,2,@mysumoutput
print@mysum

--執行存儲過程獲取Return型返回值
declare@mysum2int
execute@mysum2=PR_Sum21,2
print@mysum2八、自定義函數

函數的分類:

1)標量值函數

2)表值函數

a:內聯表值函數

b:多語句表值函數

3)系統函數--新建標量值函數
createfunctionFUNC_Sum1
(
@aint,
@bint
)
returnsint
as
begin
return@a+@b
end

--新建內聯表值函數
createfunctionFUNC_UserTab_1
(
@myIdint
)
returnstable
as
return(select*fromST_UserwhereID<@myId)

--新建多語句表值函數
createfunctionFUNC_UserTab_2
(
@myIdint
)
returns@ttable
(
[ID][int]NOTNULL,
[Oid][int]NOTNULL,
[Login][nvarchar](50)NOTNULL,
[Rtx][nvarchar](4)NOTNULL,
[Name][nvarchar](5)NOTNULL,
[Password][nvarchar](max)NULL,
[State][nvarchar](8)NOTNULL
)
as
begin
insertinto@tselect*fromST_UserwhereID<@myId
return
end

--調用表值函數
select*fromdbo.FUNC_UserTab_1(15)
--調用標量值函數
declare@sint
set@s=dbo.FUNC_Sum1(100,50)
print@s

--刪除標量值函數
dropfunctionFUNC_Sum1
談談自定義函數與存儲過程的區別:

一、自定義函數:

1.可以返回表變數

2.限制頗多,包括

不能使用output參數;

不能用臨時表;

函數內部的操作不能影響到外部環境;

不能通過select返回結果集;

不能update,delete,資料庫表;

3.必須return一個標量值或表變數

自定義函數一般用在復用度高,功能簡單單一,爭對性強的地方。

二、存儲過程

1.不能返回表變數

2.限制少,可以執行對資料庫表的操作,可以返回數據集

3.可以return一個標量值,也可以省略return

存儲過程一般用在實現復雜的功能,數據操縱方面。

Ⅵ sql server中怎樣用代碼創建存儲過程

  • 打開SQL server management studio,連接到資料庫,展開想要創建的資料庫,找到【可編程性】->【存儲過程】的菜單

Ⅶ 在MySQL中如何創建一個帶輸出參數為一個表類型的存儲過程

在MySQL中如何創建一個帶輸出參數為一個表類型的存儲過程
首先需要知道「另一個存儲過程」的結果集的所有列的類型。
假設「另一個存儲過程」的名字是sp1,沒有參數,返回的結果集共3列,全部為int型,那麼「存儲過程」里添加一個與結果集列數相同的臨時表或表變數用於接收「另一個存儲過程」的結果集
如下
CREATE
PROCEDURE
sp2
AS
DECLARE
@t
table(a
int,b
int,c
int)
INSERT
INTO
@t(a,b,c)
EXEC
sp1
SELECT
*
FROM
@t
使用SQLSERVER存儲過程可以很大的提高程序運行速度,簡化編程維護難度,現已得到廣泛應用。
創建存儲過程
和數據表一樣,在使用之前需要創建存儲過程,它的簡明語法是:
引用:
Create
PROC
存儲過程名稱
[參數列表(多個以「,」分隔)]
AS
SQL
語句
例:
引用:
Create
PROC
upGetUserName
@intUserId
INT,
@ostrUserName
NVARCHAR(20)
OUTPUT
--
要輸出的參數
AS
BEGIN
--
將uName的值賦給
@ostrUserName
變數,即要輸出的參數
Select
@ostrUserName=uName
FROM
uUser
Where
uId=@intUserId
END
其中
Create
PROC
語句(完整語句為Create
PROCEDURE)的意思就是告訴SQL
SERVER,現在需要建立一個存儲過程,upGetUserName
就是存儲過程名稱,@intUserId

@ostrUserName
分別是該存儲過程的兩個參數,注意,在SQL
SERVER中,所有用戶定義的變數都以「@」開頭,OUTPUT關鍵字表示這個參數是用來輸出的,AS之後就是存儲過程內容了。只要將以上代碼在「查詢分析器」里執行一次,SQL
SERVER就會在當前資料庫中創建一個名為「upGetUserName」的存儲過程。你可以打開「企業管理器」,選擇當前操作的資料庫,然後在左邊的樹型列表中選擇「存儲過程」,此時就可以在右邊的列表中看到你剛剛創建的存儲過程了(如果沒有,刷新一下即可)。
二、存儲過程的調用
之前已經創建了一個名為「upGetUserName」的存儲過程,從字面理解該存儲過程的功能是用來取得某一個用戶的名稱。存儲過程建立好了,接下來就是要在應用程序里調用了,下面看一下在ASP程序里的調用。