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