sqlserver2005存儲過程
存儲過程是指封裝了可重用代碼的模塊或常式。存儲過程可以接受輸入參數、向客戶端返回表格或標量結果和消息、調用數據定義語言 (DDL) 和數據操作語言 (DML) 語句,然後返回輸出參數。在 SQL Server 2005 中,存儲過程有兩種類型:Transact-SQL 或 CLR。
Transact-SQL
Transact-SQL 存儲過程是指保存的 Transact-SQL 語句集合,可以接受和返回用戶提供的參數。例如,存儲過程中可能包含根據客戶端應用程序提供的信息在一個或多個表中插入新行所需的語句。存儲過程也可能從資料庫向客戶端應用程序返回數據。
CLR
CLR 存儲過程是指對 Microsoft .NET Framework 公共語言運行時 (CLR) 方法的引用,可以接受和返回用戶提供的參數。它們在 .NET Framework 程序集中是作為類的公共靜態方法實現的。
⑵ 怎樣對SQL Server 2005存儲過程解密
下面是解密的存儲過程,具體代碼如下(這是版本4.0,最新的,修正很長的存儲過程解密出來是空白的問題):
Code
CreatePROCEDURE[dbo].[sp__windbi$decrypt]
(@proceresysname=NULL,@revflint=1)
AS
/**//*
王成輝翻譯整理,轉貼請註明出自微軟BI開拓者www.windbi.com
調用形式為:
execdbo.sp__windbi$decrypt@procere,0
如果第二個參數使用1的話,會給出該存儲過程的一些提示。
--版本4.0修正存儲過程過長解密出來是空白的問題
*/
SETNOCOUNTON
IF@revfl=1
BEGIN
PRINT'警告:該存儲過程會刪除並重建原始的存儲過程。'
PRINT'在運行該存儲過程之前確保你的資料庫有一個備份。'
PRINT'該存儲過程通常應該運行在產品環境的一個備份的非產品環境下。'
PRINT'為了運行這個存儲過程,將參數@refl的值更改為0。'
RETURN0
END
DECLARE@intProcSpacebigint,@tbigint,@maxColIDsmallint,@procNameLengthint
select@maxColID=max(subobjid)FROM
sys.sysobjvaluesWHEREobjid=object_id(@procere)
--select@maxColIDas'Rowsinsys.sysobjvalues'
select@procNameLength=datalength(@procere)+29
DECLARE@real_01nvarchar(max)
DECLARE@fake_01nvarchar(max)
DECLARE@fake_encrypt_01nvarchar(max)
DECLARE@real_decrypt_01nvarchar(max),@real_decrypt_01anvarchar(max)
declare@objtypevarchar(2),@ParentNamenvarchar(max)
select@real_decrypt_01a=''
--提取對象的類型如是存儲過程還是函數,如果是觸發器,還要得到其父對象的名稱
select@objtype=type,@parentname=object_name(parent_object_id)
fromsys.objectswhere[object_id]=object_id(@procere)
--從sys.sysobjvalues里提出加密的imageval記錄
SET@real_01=(SELECTtop1imagevalFROMsys.sysobjvaluesWHEREobjid=
object_id(@procere)andvalclass=1orderbysubobjid)
--創建一個臨時表
createtable#output([ident][int]IDENTITY(1,1)NOTNULL,
[real_decrypt]NVARCHAR(MAX))
--開始一個事務,稍後回滾
BEGINTRAN
--更改原始的存儲過程,用短橫線替換
if@objtype='P'
SET@fake_01='ALTERPROCEDURE'+@procere+'WITHENCRYPTIONASselect1
/**//*'+REPLICATE(cast('*'asnvarchar(max)),datalength(@real_01)/2-@procNameLength)+'*/'
elseif@objtype='FN'
SET@fake_01='ALTERFUNCTION'+@procere+'()
/**//*'+REPLICATE(cast('*'asnvarchar(max)),datalength(@real_01)/2-@procNameLength)+'*/END'
elseif@objtype='V'
SET@fake_01='ALTERview'+@procere+'WITHENCRYPTIONASselect1ascol
/**//*'+REPLICATE(cast('*'asnvarchar(max)),datalength(@real_01)/2-@procNameLength)+'*/'
elseif@objtype='TR'
SET@fake_01='ALTERtrigger'+@procere+'ON'+@parentname+'(''N'',16,10)
/**//*'+REPLICATE(cast('*'asnvarchar(max)),datalength(@real_01)/2-@procNameLength)+'*/'
EXECUTE(@fake_01)
--從sys.sysobjvalues里提出加密的假的
SET@fake_encrypt_01=(SELECTtop1imagevalFROMsys.sysobjvaluesWHEREobjid=
object_id(@procere)andvalclass=1orderbysubobjid)
if@objtype='P'
SET@fake_01='CreatePROCEDURE'+@procere+'WITHENCRYPTIONASselect1
/**//*'+REPLICATE(cast('*'asnvarchar(max)),datalength(@real_01)/2-@procNameLength)+'*/'
elseif@objtype='FN'
SET@fake_01='CREATEFUNCTION'+@procere+'()
/**//*'+REPLICATE(cast('*'asnvarchar(max)),datalength(@real_01)/2-@procNameLength)+'*/END'
elseif@objtype='V'
SET@fake_01='Createview'+@procere+'WITHENCRYPTIONASselect1ascol
/**//*'+REPLICATE(cast('*'asnvarchar(max)),datalength(@real_01)/2-@procNameLength)+'*/'
elseif@objtype='TR'
SET@fake_01='Createtrigger'+@procere+'ON'+@parentname+'(''N'',16,10)
/**//*'+REPLICATE(cast('*'asnvarchar(max)),datalength(@real_01)/2-@procNameLength)+'*/'
--開始計數
SET@intProcSpace=1
--使用字元填充臨時變數
SET@real_decrypt_01=replicate(cast('A'asnvarchar(max)),(datalength(@real_01)/2))
--循環設置每一個變數,創建真正的變數
--每次一個位元組
SET@intProcSpace=1
--如有必要,遍歷每個@real_xx變數並解密
WHILE@intProcSpace<=(datalength(@real_01)/2)
BEGIN
--真的和假的和加密的假的進行異或處理
SET@real_decrypt_01=stuff(@real_decrypt_01,@intProcSpace,1,
NCHAR(UNICODE(substring(@real_01,@intProcSpace,1))^
(UNICODE(substring(@fake_01,@intProcSpace,1))^
UNICODE(substring(@fake_encrypt_01,@intProcSpace,1)))))
SET@intProcSpace=@intProcSpace+1
END
--通過sp_helptext邏輯向表#output里插入變數
insert#output(real_decrypt)select@real_decrypt_01
--selectreal_decryptAS'#outputchek'from#output--測試
---------------------------------------
--開始從sp_helptext提取
---------------------------------------
declare@dbnamesysname
,@BlankSpaceAddedint
,@BasePosint
,@CurrentPosint
,@TextLengthint
,@LineIdint
,@AddOnLenint
,@LFCRint--回車換行的長度
,@DefinedLengthint
,@SyscomTextnvarchar(max)
,@Linenvarchar(255)
Select@DefinedLength=255
SELECT@BlankSpaceAdded=0--跟蹤行結束的空格。注意Len函數忽略了多餘的空格
CREATETABLE#CommentText
(LineIdint
,Textnvarchar(255)collatedatabase_default)
--使用#output代替sys.sysobjvalues
DECLAREms_crs_syscomCURSORLOCAL
FORSELECTreal_decryptfrom#output
ORDERBYident
FORREADONLY
--獲取文本
SELECT@LFCR=2
SELECT@LineId=1
OPENms_crs_syscom
FETCHNEXTFROMms_crs_syscominto@SyscomText
WHILE@@fetch_status>=0
BEGIN
SELECT@BasePos=1
SELECT@CurrentPos=1
SELECT@TextLength=LEN(@SyscomText)
WHILE@CurrentPos!=0
BEGIN
--通過回車查找行的結束
SELECT@CurrentPos=CHARINDEX(char(13)+char(10),@SyscomText,
@BasePos)
--如果找到回車
IF@CurrentPos!=0
BEGIN
--如果@Lines的長度的新值比設置的大就插入@Lines目前的內容並繼續
While(isnull(LEN(@Line),0)+@BlankSpaceAdded+
@CurrentPos-@BasePos+@LFCR)>@DefinedLength
BEGIN
SELECT@AddOnLen=@DefinedLength-(isnull(LEN(@Line),0)+
@BlankSpaceAdded)
INSERT#CommentTextVALUES
(@LineId,
isnull(@Line,N'')+isnull(SUBSTRING(@SyscomText,
@BasePos,@AddOnLen),N''))
SELECT@Line=NULL,@LineId=@LineId+1,
@BasePos=@BasePos+@AddOnLen,@BlankSpaceAdded=0
END
SELECT@Line=isnull(@Line,N'')+
isnull(SUBSTRING(@SyscomText,@BasePos,@CurrentPos-@BasePos+@LFCR),N'')
SELECT@BasePos=@CurrentPos+2
INSERT#CommentTextVALUES(@LineId,@Line)
SELECT@LineId=@LineId+1
SELECT@Line=NULL
END
ELSE
--如果回車沒找到
BEGIN
IF@BasePos<=@TextLength
BEGIN
--如果@Lines長度的新值大於定義的長度
While(isnull(LEN(@Line),0)+@BlankSpaceAdded+
@TextLength-@BasePos+1)>@DefinedLength
BEGIN
SELECT@AddOnLen=@DefinedLength-
(isnull(LEN(@Line),0)+@BlankSpaceAdded)
INSERT#CommentTextVALUES
(@LineId,
isnull(@Line,N'')+isnull(SUBSTRING(@SyscomText,
@BasePos,@AddOnLen),N''))
SELECT@Line=NULL,@LineId=@LineId+1,
@BasePos=@BasePos+@AddOnLen,@BlankSpaceAdded=
END
SELECT@Line=isnull(@Line,N'')+
isnull(SUBSTRING(@SyscomText,@BasePos,@TextLength-@BasePos+1),N'')
ifLEN(@Line)<@DefinedLengthandcharindex('',
@SyscomText,@TextLength+1)>0
BEGIN
SELECT@Line=@Line+'',@BlankSpaceAdded=1
END
END
END
END
FETCHNEXTFROMms_crs_syscominto@SyscomText
END
IF@LineisNOTNULL
INSERT#CommentTextVALUES(@LineId,@Line)
selectTextfrom#CommentTextorderbyLineId
CLOSEms_crs_syscom
DEALLOCATEms_crs_syscom
DROPTABLE#CommentText
---------------------------------------
--結束從sp_helptext提取
---------------------------------------
--刪除用短橫線創建的存儲過程並重建原始的存儲過程
ROLLBACKTRAN
DROPTABLE#output
go
⑶ sqlserver2005 存儲過程返回值的問題
返回結果的方式有很多我說兩種,一種是利用存儲過程的參數可以把存儲過程的結果返回,另外一種是在外部接收存儲過程內部return出來的結果。當然啦,還可以在存儲過程內部select要返回的結果。
比如:
createproctest
@p_errormsgvarchar(80)=''out
as
select@p_errormsg='測試'
return-100
go
--------------------------------------------------------------
declare@errorcodeint
declare@errormsgvarchar(80)
exec@errorcode=test@errormsgout
select@errorcodeaserrorcode,@errormsgaserrormsg
--@errorcode是return出來的結果@errormsg是輸出參數@p_errormsg的執行結果
⑷ 怎樣修改SQL Server 2005/2008的系統存儲過程
我們知道,SQLServer2005/2008的系統存儲過程在正常情況下是無法直接修改的。
盡管本文是介紹怎樣修改它的,但在這里,我還是建議大家盡量不要去修改它。(好像有點繞哈...)
OK,閑話少說,下面我舉個實際案例講解一下,如對於系統存儲過程sp_Monitor,若要運行此存儲過程,用戶必須是sysadmin固定伺服器角色的成員。
通過執行命令:sp_helptext'sp_Monitor',我們可以看到,該過程中存在這樣的語句:
if(not(is_srvrolemember('sysadmin')=1))--.
begin
raiserror(15247,-1,-1)
return(1)
end
在這里,我想將該過程中的這些語句去掉,讓它能被普通用戶執行。下面是具體的修改步驟:
1、停止SQLServer服務
2、進入命令提示行模式。依次執行以下命令:
1)cdC:/ProgramFiles/MicrosoftSQLServer/MSSQL.1/MSSQL/Binn--註:這是SQL2005的默認安裝目錄,如你改變了實際安裝路徑,請按實際修改
2)sqlservr-sMSSQLSERVER-m--註:啟動SQLServer服務,-s指定實例名稱(這里的實例名稱是MSSQLSERVER,可按實際修改),-m指定以單用戶管理模式啟動
3、以資料庫專用管理員(DAC)方式連接SSMS(此處可參見SQLServer資料庫專用管理員DAC連接方式)
4、執行語句:USEmssqlsystemresource
這里,我友情說明一下,mssqlsystemresource是一個系統資料庫,它存儲了所有系統存儲過程、視圖和函數。但它對於所有用戶來說,都是不可見的,也就是說,在SSMS、sys.databases等裡面,你都看不到它,如果在非DAC連接下,執行上述語句,系統會報錯。
5、執行語句:_write--將mssqlsystemresource置為可修改狀態,mssqlsystemresource資料庫默認是只讀的。
6、sp_helptext'sp_Monitor'--顯示該存儲過程的源代碼,你可將sp_Monitor改成你實際要改的存儲過程名。
7、拷貝步驟6的結果,將createproc改成alterproc,並按你的實際需求修改代碼,這里,我將前述的"if(not(is_srvrolemember('sysadmin')=1))--......"等語句去掉。
8、執行修改後的語句。--到這一步為止,系統存儲過程sp_Monitor已經被我們改了。
9、_only--將mssqlsystemresource還原為只讀狀態
10、最後,停止SQLServer服務,並以正常方法重新啟動SQLServer.
老實說,上面的方法顯得較為繁瑣,不得萬不得已,我不推薦使用。(再強調一次)
其實,可以拷貝系統存儲過程的源代碼到一個新建的存儲過程中,然後再對這個新建的存儲過程進行修改,在使用的時候,直接調用這個新過程即可。同樣可以達到目的,而且還沒有任何副作用
⑸ sql server2005 sql的存儲過程怎麼編寫
create
proc[ere]存儲過程名
[{@參數
數據類型
}[=默認值][output]]
[with
encryption]
-----------------------------------------表示對儲過程的文本進行加密,防止它人查看或修改.
as
T-SQL語句[......]。
注意:[
]內的內容為可寫項,也可不寫。
我就只知道這么多了,其餘就不清楚了
⑹ 如何在SQL SERVER 2005存儲過程中,使用循環語句
實現循環有很多種方式 看你需要 或者喜歡
有for 循環
有while 循環
有foreach 循環
等等 我用的不是 sql sever資料庫 具體的 你自己寫寫看
------------------------------------------------------------
SQL
SERVER資料庫建立存儲過程時,可以使用循環語句,下面就將為您介紹這種SQL SERVER資料庫中存儲過程使用循環語句的方法,供您參考。
CREAT PROCEDURE tester
AS
BEGIN
SET NOCOUNT ON;
DECLARE @userId varchar(50)
DECLARE @count int
SET @count =
0
SELECT @count = count(*) FROM UserService_User WHERE Account like
'%111%'
WHILE @count > 0
BEGIN
SELECT @userId = Id
FROM UserService_User WHERE Account like '%111%'
exec
UserService_RemoveUserByUserId @userId
SET @count = @count -1
END
END
說明:
1、此存儲過程在SQL SERVER 2005上測試通過,值得注意的是,循環體中,語句是使用BEGIN……END包括的,而不是網路上常說的WHILE
……END WHILE結構,其他的循環語句,如LOOP ……UNTIL……END LOOP也不能通過編譯,也許是版本的問題,但在SQL
SERVER2005中,循環體使用BEGIN……END就可以,而不能使用網路上常說的WHILE ……END WHILE結構。
2、循環體中 UserService_RemoveUserByUserId
是一個存儲過程的名稱,@userId為該存儲過程的參數,如果有多個參數,使用「,」分開就可以了,這也是存儲過程調用另一個存儲過程的一種方法。
這個是我從網上網路的 希望對你有用
⑺ 在Sql Server 2005中,如何寫存儲過程,得到資料庫中各個表的記錄數
給你一個思路:
1:先查詢資料庫中有多少表放到一張表中
select indentity(int,1,1)name
into #a
from sysobjects where xtype='U'
2:
統計一共有多少張表,循環執行取得每張表的名字,
來查詢表的記錄數放到一張表b中
3:
查詢存放記錄的表
你先自己動手寫寫看,不會的話我在幫你寫
⑻ SQL server 2005資料庫中如何調用帶參數的存儲過程
你指的是帶哪種參數?有兩種的,例如:
--第一種情況:
--建議存儲過程
CREATE PROCEDURE [AAAA]
(
@Code VARCHAR(50)
)
AS
SELECT *
FROM 表
WHERE 編號 = @Code
GO
-- 調用的時候
EXECUTE [AAAA] @Code(具體值)
--第二種情況:
--建議存儲過程
CREATE PROCEDURE [AAAA]
(
@Code VARCHAR(50)
,@Flag INT OUTPUT
)
AS
DECLARE @B INT
SET @B = 0;
SELECT @B = COUNT(編號)
FROM 表
WHERE 編號 = @Code
IF @B = 0
BEGIN
@Flag = 0;
END
ELSE BEGIN
@Flag = 1
END
GO
-- 調用的時候
DECLARE @Flag INT
EXECUTE [AAAA] @Code
,@Flag OUTPUT
SELECT @Flag
⑼ SQL Server 2005 中存儲過程的輸入參數和輸出參數的區別
輸入參數是傳遞給存儲過程的,就是原料.輸出參數是存儲過程的產出,就是產品.
在調用存儲過程前,相關的輸入參數必須已經有確定的值;
存儲過程根據輸入參數的值以及內部演算法,將計算的結果保存到輸出參數中.
輸出參數在調用存儲過程前無須有確定的值,只需定義這樣一個變數,將他傳給存儲過程,存儲過程執行之後,該輸出參數就有了確定的值.可以進一步使用該值.
⑽ sql server 2005 中存儲過程的創建過程
對象資源管理器里(窗口左邊)、資料庫小圓柱右鍵、可編程性、存儲過程、右鍵新建存儲過程
也可以
使用語句創建:
新建查詢輸入:
create
procere
存儲過程名
參數
as
begin
...
end