SQL的存儲過程
sql存儲過程說簡單點就是一個在t-sql下用戶可以自行定義的函數,
但是與一般的函數也有不同的地方,比如它的返回值只能return(int類型),如果你要輸出什麼信息的話只能用output.這也是存儲過程的一個特色吧,設定的參數可以有輸出。講起來有點抽象,給你個例子看看吧!
首先創建一個存儲過程
create
procere
cunchuguocheng
@a
int,
@b
int,
@c
int
output
as
begin
select
@c
=
@a+@b
return(0)
end
然後調用這個存儲過程
declare
@value
int,
--返回值
@c
int
--結果值
exec
@value
=
cunchuguocheng
2,2,@c
output
select
@value
as
返回值
select
@c
as
結果值
程序寫的很簡單,你運行一下我想你就會對存儲過程有所了解了。
Ⅱ SQL存儲過程是什麼
就是在sql裡面,可以執行的一段程序代碼,就好比軟體開發,就是一段代碼,來處理一些事情,
sql的存儲過程就是一段代碼,來處理一些事情,可以被調用執行,也可以在定時器裡面調用來定時處理
Ⅲ sql存儲過程是什麼
所有設計優良的 Microsoft® SQL Server™ 2000 應用程序都應當使用存儲過程。不論是否將應用程序的業務邏輯寫入存儲過程都應如此。甚至連沒有業務邏輯組件的標准 Transact-SQL 語句,在用參數打包成存儲過程後也能獲得性能收益。編譯進存儲過程的 Transact-SQL 語句在執行時可省去大量的處理。
存儲過程的另一個優點是客戶端執行請求使用網路的效率比將等效的 Transact-SQL 語句發送到伺服器高。例如,假設應用程序需要將一個大的二進制值插入 image 數據列。為使用 INSERT 語句發送數據,該應用程序必須將該二進制值轉換為字元串(其大小翻倍),然後發送到伺服器。伺服器再將該值轉換回二進制格式以存儲在 image 列中。
相反,應用程序可以創建下列格式的存儲過程:
CREATE PROCEDURE P(@p1 image) AS INSERT T VALUES (@p1)
當客戶端應用程序請求執行過程 P 時,image 參數值將一直以二進制格式發送到伺服器,從而節省處理時間並減少網路流量。
如果 SQL Server 存儲過程中包含業務服務邏輯,因為業務服務邏輯將處理移動到數據,而不是將數據移動到處理,因而存儲過程能提供更大的性能收益。
存儲過程的優點
(1)存儲過程的能力大大增強了SQL語言的功能和靈活性。存儲過程可以用流控制語句編寫,有很強的靈活性,可以完成復雜的判斷和較復雜的 運算。
(2) 可保證數據的安全性和完整性。
● 通過存儲過程可以使沒有許可權的用戶在控制之下間接地存取資料庫,從而保證數據的安全。
● 通過存儲過程可以使相關的動作在一起發生,從而可以維護資料庫的完整性。
(3) 再運行存儲過程前,資料庫已對其進行了語法和句法分析,並給出了優化執行方案。這種已經編譯好的過程可極大地改善SQL語句的性能。 由於執行SQL語句的大部分工作已經完成,所以存儲過程能以極快的速度執行。
(4)可以降低網路的通信量。
(5) 使體現企業規則的運算程序放入資料庫伺服器中,以便:
● 集中控制。
● 當企業規則發生變化時在伺服器中改變存儲過程即可,無須修改任何應用程序。企業規則的特點是要經常變化,如果把體現企業規則的運算程序放入應用程序中,則當企業規則發生變化時,就需要修改應用程序工作量非常之大(修改、發行和安裝應用程序)。如果把體現企業規則的 運算放入存儲過程中,則當企業規則發生變化時,只要修改存儲過程就可以了,應用程序無須任何變化。
1.使用企業管理器創建用戶存儲過程
操作步驟如下:
(1)啟動SQL Server企業管理器。
(2)在「控制台根目錄」窗口,展開「SQL Server組」,首先,選擇「資料庫」,然後,選擇「存儲過程」,單擊滑鼠右鍵,打開快捷菜單。
(3)在打開快捷菜單中,選擇「新建存儲過程」菜單命令,進入「存儲過程屬性」窗口。
(4)在「存儲過程屬性」窗口,在文本框中輸入存儲過程代碼,單擊「確定」,結束存儲過程的創建。
2.使用T-SQL語句創建用戶存儲過程
SQL命令格式:
CREATE PROC [ EDURE ] <Procere_name> [ ; Number ]
[ { @parameter Data_type }
[ VARYING ] [ = Default ] [ OUTPUT ]] [ ,...n ]
[ WITH{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION }]
[ FOR REPLICATION ]
AS sql_statements
功能:創建一個用戶存儲過程,並保存在資料庫中。
Ⅳ SQL存儲過程
CREATE PROCEDURE SP_Transfer
(
@StartDate DATETIME INPUT,
@EndDate DATETIME INPUT,
@Result int OUTPUT
)
AS
BEGIN
Select @Result = [欄位名] From [表名]
WHERE indate_start = @StartDate AND
indate_end = @EndDate
END
Declare @RESULT INT;
EXEC SP_Transfer N'2009-06-30' N'2009-07-29' @RESULT
PRINT @RESULT
Ⅳ SQL的存儲過程怎麼用!~~
存儲過程相當於Java,C#中的函數,就按照函數的用法理解就可以了。
Ⅵ sql語句存儲過程
可以先將多個商品ID拼成一個字元串("3,4,5")再傳進去
create PROCEDURE pro_deleteProct
@Uid int ,
@Pids varchar(50)
AS
declare @sql varchar(200)
BEGIN
set @sql= 'delete from Procts where ProctId = '+ convert(varchar(20),@Uid) +' and ProctId in ('+@Pids+')'
--print @sql
exec (@sql)
END
GO
Ⅶ SQL存儲過程!!!
你可以用output類型的參數。這里的輸出是一個字元串,用「,」分割,你試試
IF
EXISTS
(
SELECT
*
FROM
dbo.sysobjects
WHERE
type
=
'P'
AND
name
=
'P_XXX'
)
BEGIN
DROP
PROCEDURE
[dbo].[P_XXX]
END
GO
CREATE
PROCEDURE
[dbo].[P_XXX]
(
@date
DATETIME
,
@Name
VARCHAR(MAX)
OUTPUT
)
AS
BEGIN
IF
EXISTS
(
SELECT
*
FROM
Daily
WHERE
Date
=
@date
)
BEGIN
SELECT
SUBSTRING(A.Name,
0,
LEN(A.Name))
FROM
(
SELECT
Name
+
','
FROM
@Record
FOR
XML
PATH('')
)
A
(
Name
)
END
ELSE
BEGIN
SELECT
@Name
=
''
END
END
GO
C#代碼
SqlCommand
CMD
=
new
SqlCommand(「P_XXX」,DBCN);
CMD.CommandType
=
CommandType.StoredProcere;
CMD.Parameters.Add("@Name",SqlDbType.varchar,2000);
CMD.Parameters["@Name"].Direction
=
ParameterDirection.Output;
Ⅷ sql 存儲過程
@where的值是 and a.parm_obj_id =4399
.... where a.parm='aa' @where 這是不對的
如果你必須要這樣做的話,用其他方式吧
declare @SQL nvarchar(4000)
set @SQL = 'select * from tb where a.parm=''aa'' ' + @where
exec sp_executesql @sql
Ⅸ SQL 存儲過程
仔細思考一下我的解決辦法是否妥當:
因為過程開頭部分已經定義了4個變數,並且都賦初值為'0',
那麼,我們做兩處變動:
1、在你的select語句執行前,我們寫上4個判斷,判斷這4個變數是否被傳入了值,未傳入時怎麼樣處理。
2、修改select語句的where子句(語句中有三個「=」改成like)。
過多的描述也許難以看懂,我直接寫出來,新增或修改的部分,我在後面用了注釋「//--★」(我的寫法是基於Sybase的,你可以看懂的。當然你也可以先看一下後面的【總結】):
if exists(………………………………)
drop ……………………
go
create Proc Proc_ManualSign
@BranchId varchar(10) = '0',
……………………
……………………
@UserName varchar(50) = '0'
as
begin //--★sybase寫法,用於過程開始,參考你的資料庫,看是否需要加
if @BranchId = '0' //--★如果@BranchId依然為初始值(未傳入參數)
select @BranchId = '%' //--★那麼將@BranchId賦值為'%'
if @DepartId = '0' //--★如果@DepartId依然為初始值(未傳入參數)
select @DepartId = '%' //--★那麼將@DepartId賦值為'%'
if @UserId = '0' //--★如果@UserId依然為初始值(未傳入參數)
select @UserId = '%' //--★那麼將@UserId賦值為'%'
if @UserName = '0' //--★如果@UserName依然為初始值(未傳入參數)
select @UserName = '%' //--★那麼將@UserName賦值為'%'
select …………
……………………
and b.BranchId like @BranchId --機構 //--★你原來的「=」改成了「like」
and d.DepartId like @DepartId --部門 //--★你原來的「=」改成了「like」
and m.UserId like @UserId --用戶Id //--★你原來的「=」改成了「like」
and u.UserName like '%'+@UserName+'%' --用戶名
end //--★sybase寫法,用於標注過程結束,參考你的資料庫,看是否需要加
go
======================================================================
【★★--總結--★★】我的辦法:
4個變數初值為'0',excute執行該過程時,if語句就要依次判斷各變數的當前值,判斷的結果無非兩種:①.未傳入值(還是'0'),②.傳入了值(不是'0')
①.未傳入值
if語句判斷出某變數未傳入值,則將該變數置為'%',那麼select語句的where條件中就是該欄位 like '%',也就是該欄位的檢索條件為任意的。
②.傳入了值
傳入了值,則if語句的判斷結果為假(False),那麼直接跳出判斷去執行select語句,雖然where子句的條件中用的是 like 介詞,但沒有通配符'%'的話,like 的作用也就是'=',即:【like '銷售部'】的作用也就是 【='銷售部'】,所以也滿足了輸入參數的精確查詢要求。
執行時:
假如什麼參數也不傳入,即:查詢全部的信息
excute Proc_ManualSign '0', '0', '0', '0'
假如僅部門和用戶ID傳入參數,則
excute Proc_ManualSign '0', '開發部', '319', '0'