實例1:只返回單一記錄集的存儲過程。
銀行存款表(bankMoney)的內容如下
Id
userID
Sex
Money
001
Zhangsan
男
30
002
Wangwu
男
50
003
Zhangsan
男
40
要求1:查詢表bankMoney的內容的存儲過程
create
procere
sp_query_bankMoney
as
select
*
from
bankMoney
go
exec
sp_query_bankMoney
注*
在使用過程中只需要把中的SQL語句替換為存儲過程名,就可以了很方便吧!
實例2(向存儲過程中傳遞參數):
加入一筆記錄到表bankMoney,並查詢此表中userID=
Zhangsan的所有存款的總金額。
Create
proc
insert_bank
@param1
char(10),@param2
varchar(20),@param3
varchar(20),@param4
int,@param5
int
output
with
encryption
---------加密
as
insert
bankMoney
(id,userID,sex,Money)
Values(@param1,@param2,@param3,
@param4)
select
@param5=sum(Money)
from
bankMoney
where
userID='Zhangsan'
go
在SQL
Server查詢分析器中執行該存儲過程的方法是:
declare
@total_price
int
exec
insert_bank
'004','Zhangsan','男',100,@total_price
output
print
'總余額為'+convert(varchar,@total_price)
go
在這里再啰嗦一下存儲過程的3種傳回值(方便正在看這個例子的朋友不用再去查看語法內容):
1.以Return傳回整數
2.以output格式傳回參數
3.Recordset
傳回值的區別:
output和return都可在批次程式中用變數接收,而recordset則傳回到執行批次的客戶端中。
實例3:使用帶有復雜
SELECT
語句的簡單過程
下面的存儲過程從四個表的聯接中返回所有作者(提供了姓名)、出版的書籍以及出版社。該存儲過程不使用任何參數。
USE
pubs
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'au_info_all'
AND
type
=
'P')
DROP
PROCEDURE
au_info_all
GO
CREATE
PROCEDURE
au_info_all
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
GO
au_info_all
存儲過程可以通過以下方法執行:
EXECUTE
au_info_all
實例4:使用帶有參數的簡單過程
CREATE
PROCEDURE
au_info
@lastname
varchar(40),
@firstname
varchar(20)
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
WHERE
au_fname
=
@firstname
AND
au_lname
=
@lastname
GO
au_info
存儲過程可以通過以下方法執行:
EXECUTE
au_info
'Dull',
'Ann'
--
Or
EXECUTE
au_info
@lastname
=
'Dull',
@firstname
=
'Ann'
--
Or
EXECUTE
au_info
@firstname
=
'Ann',
@lastname
=
'Dull'
實例5:使用帶有通配符參數的簡單過程
CREATE
PROCEDURE
au_info2
@lastname
varchar(30)
=
'D%',
@firstname
varchar(18)
=
'%'
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
WHERE
au_fname
LIKE
@firstname
AND
au_lname
LIKE
@lastname
GO
au_info2
存儲過程可以用多種組合執行。下面只列出了部分組合:
EXECUTE
au_info2
--
Or
EXECUTE
au_info2
'Wh%'
--
Or
EXECUTE
au_info2
@firstname
=
'A%'
--
Or
EXECUTE
au_info2
'[CK]ars[OE]n'
--
Or
EXECUTE
au_info2
'Hunter',
'Sheryl'
--
Or
EXECUTE
au_info2
'H%',
'S%'
『貳』 在sql Server中~如何利用RETURN返回存儲過程的值~~~
假設有這樣定義的存儲過程checkstateCREATE PROCEDURE checkstate @param varchar(11) AS IF (SELECT state FROM authors WHERE au_id = @param) = 'CA' RETURN 1 ELSE RETURN 2 下例顯示從 checkstate 執行中返回的狀態。第一個顯示的是在加利福尼亞州的作者;第二個顯示的是不在加利福尼亞州的作者,第三個顯示的是無效的作者。必須先聲明 @return_status 局部變數後才能使用它。DECLARE @return_status int EXEC @return_status = checkstate '172-32-1176' SELECT 'Return Status' = @return_status GO OutPut是通過參數傳遞值的
『叄』 sql中 return 與output 的區別
共同點:都返回值(但return只能返回int類型)
不同點:1. output是定義變數是不是可以返回值
2. output沒有return從查詢或過程中無條件退出的工功
3. return返回值在函數和過程定義時不需要用output來定義
『肆』 如何接收sql語句執行.的返回值
獲取存儲過程返回值及代碼中獲取返回值
1.OUPUT參數返回值
例: 向Order表插入一條記錄,返回其標識
CREATE PROCEDURE [dbo].[nb_order_insert](
@o_buyerid int ,
@o_id bigint OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
BEGIN
INSERT INTO [Order](o_buyerid )
VALUES (@o_buyerid )
SET @o_id = @@IDENTITY
END
END
存儲過程中獲得方法:
DECLARE @o_buyerid int
DECLARE @o_id bigint
EXEC [nb_order_insert] @o_buyerid ,o_id bigint
2.RETURN過程返回值
CREATE PROCEDURE [dbo].[nb_order_insert](
@o_buyerid int ,
@o_id bigint OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
IF(EXISTS(SELECT * FROM [Shop] WHERE [s_id] = @o_shopid))
BEGIN
INSERT INTO [Order](o_buyerid )
VALUES (@o_buyerid )
SET @o_id = @@IDENTITY
RETURN 1 — 插入成功返回1
END
ELSE
RETURN 0 — 插入失敗返回0
END
存儲過程中的獲取方法
DECLARE @o_buyerid int
DECLARE @o_id bigint
DECLARE @result bit
EXEC @result = [nb_order_insert] @o_buyerid ,o_id bigint
3.SELECT 數據集返回值
CREATE PROCEDURE [dbo].[nb_order_select](
@o_id int
)
AS
BEGIN
SET NOCOUNT ON;
SELECT o_id,o_buyerid FROM [Order]
WHERE o_id = @o_id
GO
存儲過程中的獲取方法
(1)、使用臨時表的方法
CREATE TABLE [dbo].[Temp](
[o_id] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[o_buyerid] [int] NOT NULL
)
INSERT [Temp] EXEC [nb_order_select] @o_id
– 這時 Temp 就是EXEC執行SELECT 後的結果集
SELECT * FROM [Temp]
DROP [Temp] — 刪除臨時表
(2)、速度不怎麼樣.(不推薦)
SELECT * from openrowset(』provider_name','Trusted_Connection=yes』,'exec nb_order_select』)
1.獲取Return返回值
程序代碼
//存儲過程
//Create PROCEDURE MYSQL
// @a int,
// @b int
//AS
// return @a + @b
//GO
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());
conn.Open();
SqlCommand MyCommand = new SqlCommand("MYSQL", conn);
MyCommand.CommandType = CommandType.StoredProcere;
MyCommand.Parameters.Add(new SqlParameter("@a", SqlDbType.Int));
MyCommand.Parameters["@a"].Value = 10;
MyCommand.Parameters.Add(new SqlParameter("@b", SqlDbType.Int));
MyCommand.Parameters["@b"].Value = 20;
MyCommand.Parameters.Add(new SqlParameter("@return", SqlDbType.Int));
MyCommand.Parameters["@return"].Direction = ParameterDirection.ReturnValue;
MyCommand.ExecuteNonQuery();
Response.Write(MyCommand.Parameters["@return"].Value.ToString());
2.獲取Output輸出參數值
程序代碼
//存儲過程
//Create PROCEDURE MYSQL
// @a int,
// @b int,
// @c int output
//AS
// Set @c = @a + @b
//GO
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());
conn.Open();
SqlCommand MyCommand = new SqlCommand("MYSQL", conn);
MyCommand.CommandType = CommandType.StoredProcere;
MyCommand.Parameters.Add(new SqlParameter("@a", SqlDbType.Int));
MyCommand.Parameters["@a"].Value = 20;
MyCommand.Parameters.Add(new SqlParameter("@b", SqlDbType.Int));
MyCommand.Parameters["@b"].Value = 20;
MyCommand.Parameters.Add(new SqlParameter("@c", SqlDbType.Int));
MyCommand.Parameters["@c"].Direction = ParameterDirection.Output;
MyCommand.ExecuteNonQuery();
Response.Write(MyCommand.Parameters["@c"].Value.ToString());
C#接收存儲過程返回值:
public static int User_Add(User us)
{
int iRet;
SqlConnection conn = new SqlConnection(Conn_Str);
SqlCommand cmd = new SqlCommand("User_Add", conn);
cmd.CommandType = CommandType.StoredProcere;
cmd.Parameters.AddWithValue("@UName", us.UName);
cmd.Parameters.AddWithValue("@UPass", us.UPass);
cmd.Parameters.AddWithValue("@PassQuestion", us.PassQuestion);
cmd.Parameters.AddWithValue("@PassKey", us.PassKey);
cmd.Parameters.AddWithValue("@Email", us.Email);
cmd.Parameters.AddWithValue("@RName", us.RName);
cmd.Parameters.AddWithValue("@Area", us.Area);
cmd.Parameters.AddWithValue("@Address", us.Address);
cmd.Parameters.AddWithValue("@ZipCodes", us.ZipCodes);
cmd.Parameters.AddWithValue("@Phone", us.Phone);
cmd.Parameters.AddWithValue("@QQ", us.QQ);
cmd.Parameters.Add("@RETURN_VALUE", "").Direction = ParameterDirection.ReturnValue;
try
{
conn.Open();
cmd.ExecuteNonQuery();
iRet = (int)cmd.Parameters["@RETURN_VALUE"].Value;
}
catch (SqlException ex)
{
throw ex;
}
finally
{
conn.Close();
}
return iRet;
}
C#接收存儲過程輸出參數:
public static decimal Cart_UserAmount(int UID)
{
decimal iRet;
SqlConnection conn = new SqlConnection(Conn_Str);
SqlCommand cmd = new SqlCommand("Cart_UserAmount", conn);
cmd.CommandType = CommandType.StoredProcere;
cmd.Parameters.AddWithValue("@UID", UID);
cmd.Parameters.Add("@Amount", SqlDbType.Decimal).Direction=ParameterDirection.Output;
try
{
conn.Open();
cmd.ExecuteNonQuery();
iRet = (decimal)cmd.Parameters["@Amount"].Value;
}
catch (SqlException ex)
{
throw ex;
}
finally
{
conn.Close();
}
return iRet;
}
//////////////////////////////////////////////////////////////
SQL 2000用戶自定義函數 一。SQL Server 的三種自定義函數
「自定義函數」是我們平常的說法,而「用戶定義的函數」是 SQL Server 中書面的說法。
SQL Server 2000 允許用戶創建自定義函數,自定義函數可以有返回值。
自定義函數分為:標量值函數或表值函數
•如果 RETURNS 子句指定一種標量數據類型,則函數為標量值函數。可以使用多條 Transact-SQL 語句定義標量值函數。
•如果 RETURNS 子句指定 TABLE,則函數為表值函數。
表值函數又可分為:內嵌表值函數(行內函數)或多語句函數
•如果 RETURNS 子句指定的 TABLE 不附帶列的列表,則該函數為內嵌表值函數。
•如果 RETURNS 子句指定的 TABLE 類型帶有列及其數據類型,則該函數是多語句表值函數。
標量值函數示例
CREATE FUNCTION dbo.Foo()
RETURNS int
AS
BEGIN
declare @n int
select @n=3
return @n
END
create function GetSex(@sex int)
returns varchar(2)-- 用nvarchar(1)
as -- nvarchar:不管是一個字元還是一個漢字,都存為2個位元組
begin -- varchar:漢字是2個位元組,其他字元存為1個位元組
declare @ssex varchar(2)-- 用nvarchar(1)
if(@sex=1)
set @ssex='男'
else
set @ssex='女'
return (@ssex)
end
調用:
select id,username,dbo.GetSex(Sex) as sex ,loginnum from t_user
內嵌表值函數示例
CREATE FUNCTION dbo.Foo()
RETURNS TABLE
AS
return select id, title from msgs
內嵌表值函數只有一個 select 語句。
多語句表值函數示例(部分)
CREATE FUNCTION FindUsers (@userid int )
RETURNS @FindUser TABLE (id int primary key, UserName varchar(30), RegDateTime DateTime,LoginNum int)
as
begin
insert into @FindUser Select ID, UserName,RegDateTime,LoginNum From T_User Where ID=@userid
return
end
調用:
SELECT * FROM FindUsers(6)
注意其 RETURNS 部分。
多語句函數的主體中允許使用以下語句。未在下面的列表中列出的語句不能用在函數主體中。
•賦值語句。
•控制流語句。
•DECLARE 語句,該語句定義函數局部的數據變數和游標。
•SELECT 語句,該語句包含帶有表達式的選擇列表,其中的表達式將值賦予函數的局部變數。
•游標操作,該操作引用在函數中聲明、打開、關閉和釋放的局部游標。只允許使用以 INTO 子句向局部變數賦值的 FETCH 語句;不允許使用將數據返回到客戶端的 FETCH 語句。
•INSERT、UPDATE 和 DELETE 語句,這些語句修改函數的局部 table 變數。
•EXECUTE 語句調用擴展存儲過程。
二.如何調用自定義函數
調用自定義函數(用戶定義的函數)和調用內置函數方式基本相同,
•當調用標量值函數時,必須加上「所有者」,通常是 dbo(但不是絕對,可以在企業管理器中的「用戶定義的函數」中查看所有者)。
•當調用表值函數時,可以只使用函數名稱。
示例
SELECT *
select dbo.Sta(cnt) from tbl
示例
SELECT *
FROM fn_MyTableFunc( 123.09, N'O''Neill' )
三。存儲過程和自定義函數的區別
存儲過程(用戶定義的存儲過程)和自定義函數(用戶定義的函數)的區別,在網上已經有討論過,但有些顯得過於零散,有些又篇幅過長不能保證每個人都細心閱讀。這里作一個歸納,當然只是應用層面的,可能不全面。
•存儲過程,功能強大,可以執行包括修改表等一系列資料庫操作,也可以創建為 SQL Server 啟動時自動運行的存儲過程。
•自定義函數,用戶定義函數不能用於執行一組修改全局資料庫狀態的操作。
•存儲過程,可以使用非確定函數。
•自定義函數,不允許在用戶定義函數主體中內置非確定函數。
•存儲過程,可返回記錄集。
•自定義函數,可以返回表變數。
•存儲過程,其返回值不能被直接引用。
•自定義函數,其返回值可以被直接引用。
•存儲過程,用 EXECUTE 語句執行。
•自定義函數,在查詢語句中調用。
『伍』 sql語句包含怎麼寫
sql語句包含可寫成:select * from table1 where field1 like 』%value1%』(所有包含『value1』這個模式的字元串)。
sql語句用於資料庫查詢和程序設計,比如查詢表中某欄位值「包含」某字元串的所有記錄的方法如下:
如果表中有一個name欄位,查詢name包含「張三」的所有記錄,就可以這樣寫:Stirng strsql="SELECT * FROM 表名 WHERE name LIKE 』%"+"張三"+"%』"。
(5)sqlreturnoutput擴展閱讀
sql語句包含的關聯詞
據了解,sql語句查詢某欄位值「包含於」某個字元串的所有記錄的方法如下:
如果查詢表中name欄位包含於字元串「張三是個好學生」的所有記錄,就可以這樣寫:String strsql="SELECT * FROM 表名 WHERE INSTR(』張三是個好學生』,name)>0"(記錄中的name欄位值中包括張、三、是、個、好、學、生、張三等所有記錄)。
『陸』 sql存儲過程中的output的作用是什麼
output的參數是輸出參數,執行完了存儲過程之後,這個參數的值會發生變化
不能理解為return,如果要類比,你可以理解為ref或者Out
『柒』 sql中return和output有什麼區別,在C#的C/S結構中咋處理返回值
--===================================================================
--創建存儲過程——用戶登錄(UserLogon)
--===================================================================
USE TestDemo
GO
IF OBJECT_ID ('dbo.proc_UserLogon', 'P') IS NOT NULL
DROP PROCEDURE dbo.proc_UserLogon;
GO
CREATE PROCEDURE proc_UserLogon
(
@UserID char(10), --用戶號碼
@UserPassword char(32), --用戶密碼
@UserRole nvarchar(10) OUTPUT, --用戶許可權
@StrError nvarchar(50) OUTPUT --錯誤處理
)
AS
--查詢用戶表並獲取許可權
SELECT @UserRole = UserRole FROM dbo.Users
WHERE UserID = @UserID AND UserPassword = @UserPassword
--存在該用戶則立即返回
IF @@ROWCOUNT <> 0 BEGIN
SET @StrError = ''
RETURN
END
--用戶不存在於用戶表則繼續查詢會員信息表
SELECT * FROM dbo.MemberInfo
WHERE HY_ID = @UserID AND HY_Pwd = @UserPassword
--存在則立即返回,否則提示錯誤
IF @@ROWCOUNT <> 0 BEGIN
SET @StrError = ''
RETURN
END
ELSE BEGIN
SET @StrError = N'用戶和密碼不匹配,登錄失敗!'
END
GO
//添加的命名空間
using System.Data.SqlClient;
using System.Configuration;
/// <summary>
/// 【登錄】按鈕
/// </summary>
private void btnLogon_Click(object sender, EventArgs e)
{
if (this.txtUserID.Text.Trim() == "") MessageBox.Show("非法登錄,請輸入用戶!");
else
{
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnStr"]);
//創建命令對象,設置查詢語句為登錄的存儲過程名稱
SqlCommand cmd = new SqlCommand("proc_UserLogon", conn);
//指定命令的類型為存儲過程
cmd.CommandType = CommandType.StoredProcere;
//依次添加存儲過程中的4個參數
cmd.Parameters.Add("@UserID", SqlDbType.Char, 10);
cmd.Parameters.Add("@UserPassword", SqlDbType.Char, 32);
cmd.Parameters.Add("@UserRole", SqlDbType.NVarChar, 8);
cmd.Parameters.Add("@StrError", SqlDbType.NVarChar, 50);
//依次為參數賦值
cmd.Parameters["@UserID"].Value = this.txtUserID.Text.Trim();
cmd.Parameters["@UserPassword"].Value = this.txtUserPwd.Text.Trim();
//參數@UserRole和@StrError為輸出參數,必須明確指定
cmd.Parameters["@UserRole"].Direction = ParameterDirection.Output;
cmd.Parameters["@StrError"].Direction = ParameterDirection.Output;
try
{ conn.Open(); //打開資料庫連接
cmd.ExecuteNonQuery(); //執行命令
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
finally { conn.Close(); } //關閉資料庫連接
//讀取返回的錯誤
string StrError = cmd.Parameters["@StrError"].Value.ToString();
if (StrError == "") //判斷存儲過程執行的結果
{
string Role = cmd.Parameters["@UserRole"].Value.ToString();
qgMain qg = new qgMain();
qg.Uid = this.txtUserID.Text.Trim(); //傳遞用戶號
qg.Pwd = this.txtUserPwd.Text.Trim(); //傳遞用戶密碼
qg.Role = Role; //傳遞許可權
qg.Show();
this.Hide(); //隱藏登錄窗口
}
else MessageBox.Show(StrError);
}
}
/// <summary>
/// 【退出】按鈕
/// </summary>
private void btnExist_Click(object sender, EventArgs e)
{ Application.Exit(); } //退出當前系統
『捌』 sql存儲過程中output參數怎麼使用
output 就是這個存儲過程返回的值 也可以說輸出的值
--創建存儲過程 求最大值
CREATE PROCEDURE [dbo].[P_Max]
@a int, -- 輸入
@b int, -- 輸入
@Returnc int output --輸出
AS
if (@a>@b)
set @Returnc =@a
else
set @Returnc =@b
-- 調用
declare @Returnc int
exec P_Max 2,3,@Returnc output
select @Returnc
『玖』 SQL中存儲過程out與output有什麼不同,感覺它倆是同一個意思,一樣的用法,都是用於輸出。求
你好題主,剛好最近我也在學習SQL,不過我在學習的是Oracle,
MSSQL和Oracle倒是有很多不同的地方。
所以我特意打開MSSQL的服務,在MSSQL里寫了這么一個腳本,希望能幫助到你。
因為本人是做.Net方向的開發者,所以用了C#語言中
以下是腳本內容:
--SQLQueryCreateByFaywool
createprocProc_OutPutTest--創建
@numAint,--numA為存儲過程的參數
@numBint,--numB為另一參數
@numReturnintoutput--此為Output,也就是存儲過程的返回值
as
begin
if(@numA>@numB)
set@numReturn=@numA
else
set@numReturn=@numB--A>B的時候返回A,否則返回B
end
go
declare@numReceiveint--先聲明一個變數用來接收存儲過程的返回值
execProc_OutPutTest1,2,@numReceiveoutput
--調用存儲過程並用@numReturn接收存儲過程的返回值
select@numReceive--將會返回(1,2)中較大的數字:2
go
createprocProc_OutTest--新建存儲過程
@numCint,--參數C
@numDint,--參數D
@numEintout--參數E用來返回
as
begin
if(@numC>@numD)
set@numE=@numC--如果C>D,將C賦值給E
else
set@numE=@numD--否則將D賦值給E
end
go
declare@numOutReceiveint--聲明一個變數
set@numOutReceive=10000--將變數賦值為10000
select@numOutReceive--變數變為10000
execProc_OutTest1,2,@numOutReceiveout--將(1,2,@numOutReceive)三個數字傳入存儲過程
select@numOutReceive--再看變數就變成2了
--總結:
--Out是參數,傳進、傳出,缺一不可,在存儲過程定義的時候一定要有out標識,
--在調用該存儲過程的時候也要有out標識
--OutPut則是相當於存儲過程的返回值
--不用傳進,也不能傳進
--它是在存儲過程中定義,並且輸出的
--一句話:Out相當於C#中的ref參數(傳進、傳出缺一不可),而且傳進傳出的時候都要標識為ref
--OutPut則為C#中的方法返回值類型,在方法定義時就已經定好了
『拾』 sql中 return 與output 的區別
共同點:都返回值(但return只能返回int類型)
不同點:1.
output是定義變數是不是可以返回值
2.
output沒有return從查詢或過程中無條件退出的工功
3.
return返回值在函數和過程定義時不需要用output來定義