sqlserver創建存儲過程
SQL 創建存儲過程:
一、基礎語法:
createproc|procerepro_name
[{@參數數據類型}[=默認值][output],
{@參數數據類型}[=默認值][output],
....
]
as
SQL_statements
二、常見創建存儲過程實例
1、創建不帶參數存儲過程
createprocproc_get_student
as
select*fromstudent;
執行存儲過程:
exec proc_get_student;
2、 帶參存儲過程
createprocproc_find_stu(@startIdint,@endIdint)
as
select*fromstudentwhereidbetween@startIdand@endId
執行存儲過程:
execproc_find_stu2,4;
3、 帶通配符參數存儲過程
createprocproc_findStudentByName(@namevarchar(20)='%j%',@nextNamevarchar(20)='%')
as
select*fromstudentwherenamelike@nameandnamelike@nextName;
執行存儲過程:
execproc_findStudentByName;
execproc_findStudentByName'%o%','t%';
4、 帶輸出參數存儲過程
createprocproc_getStudentRecord(
@idint,--默認輸入參數
@namevarchar(20)out,--輸出參數
@agevarchar(20)output--輸入輸出參數
)
as
select@name=name,@age=agefromstudentwhereid=@idandsex=@age;
執行存儲過程:
declare@idint,
@namevarchar(20),
@tempvarchar(20);
set@id=7;
set@temp=1;
execproc_getStudentRecord@id,@nameout,@tempoutput;
select@name,@temp;
print@name+'#'+@temp;
Ⅱ 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語句用來向用戶報告錯誤
Ⅲ 怎麼樣利用C#代碼同時創建多個SQLServer存儲過程
在C#中,你可以使用ADO.NET庫來連接SQL Server資料庫,並通過執行SQL命令來創建多個存儲過程。這通常涉及以下幾個步驟:
1. 建立一個資料庫連接。使用`SqlConnection`類來創建一個到SQL Server資料庫的連接。你需要提供連接字元串,其中包含資料庫的位置、身份驗證信息等。
2. 打開資料庫連接。使用`SqlConnection.Open`方法來打開連接。
3. 創建並執行SQL命令。使用`SqlCommand`類來創建一個或多個SQL命令,每個命令包含創建存儲過程的SQL語句。然後,通過調用`SqlCommand.ExecuteNonQuery`方法來執行這些命令。
4. 關閉資料庫連接。完成操作後,使用`SqlConnection.Close`方法來關閉連接。
下面是一個示例代碼,演示如何使用C#同時創建兩個SQL Server存儲過程:
csharp
using System.Data.SqlClient;
class Program
{
static void Main
{
string connectionString = "YourConnectionStringHere"; // 替換為你的連接字元串
using )
{
connection.Open;
string createProcere1 = @"
CREATE PROCEDURE Procere1 AS
BEGIN
-- 存儲過程1的邏輯代碼
SELECT 'Hello from Procere1' AS Message;
END;
";
string createProcere2 = @"
CREATE PROCEDURE Procere2 AS
BEGIN
-- 存儲過程2的邏輯代碼
SELECT 'Hello from Procere2' AS Message;
END;
";
using )
{
command1.ExecuteNonQuery;
}
using )
{
command2.ExecuteNonQuery;
}
connection.Close;
}
}
}
在這個示例中,我們首先定義了一個連接字元串`connectionString`,用於指定資料庫的位置和身份驗證信息。然後,我們使用`SqlConnection`類創建了一個資料庫連接,並使用`Open`方法打開了該連接。接下來,我們定義了兩個字元串變數`createProcere1`和`createProcere2`,它們分別包含創建兩個存儲過程的SQL語句。我們使用`SqlCommand`類創建了兩個SQL命令對象,分別用於執行這兩個SQL語句。最後,我們調用`ExecuteNonQuery`方法來執行命令,並使用`Close`方法關閉了資料庫連接。
請注意,你需要將`YourConnectionStringHere`替換為實際的連接字元串,該字元串應包含足夠的信息以供C#程序連接到你的SQL Server資料庫。此外,你還需要確保資料庫用戶具有創建存儲過程的許可權。
Ⅳ sqlserver怎麼創建存儲過程
創建存儲過程的步驟如下:
打開SQL Server 2005的管理工具,選中需要創建存儲過程的資料庫,找到「可編程性」,展開後可以看到「存儲過程」。
右鍵點擊它,選擇「新建存儲過程」,右側的編輯窗口打開後,裡面裝著微軟自動生成的SQL Server創建存儲過程的語句。
將存儲過程的名字、參數、操作語句寫好後->點擊語法分析,沒有錯誤就直接按「F5」鍵運行就好了,存儲過程創建完畢。
最後可以看一下,以下是一個基本的存儲過程的代碼:
CREATE PROCEDURE Get_Data
(
@Dealer_ID VARCHAR(50)
)
AS
SELECT * FROM myData WHERE Dealer_ID = @Dealer_ID
以上是創建存儲過程的步驟,供您參考
Ⅳ sql server中怎樣用代碼創建存儲過程
打開SQL server management studio,連接到資料庫,展開想要創建的資料庫,找到【可編程性】->【存儲過程】的菜單