|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
越来越多的开发者将继续选择MySQL。Evans的总裁JohnAndrews表示,MySQL学习教程用户对MySQL和其他开源数据库的评价正在赶上甚至超过很多专有商业数据库软件。server|存储历程
浅析SQLSERVER一个没有公然的存储历程
从SQLSERVER6.5入手下手,MS供应了一个十分有效的体系存储历程sp_MSforeachtable和sp_MSforeachDB;作为DBA会常常必要反省一切的数据库或用户表,好比:反省一切数据库的容量;看看指定命据库一切用户表的容量,一切表的纪录数...,我们一样平常处置如许的成绩都是用游标分离处置处置,好比:在数据库检索效力十分慢时,我们想反省数据库一切的用户表,我们就必需如许写游标:
DECLARE@TableNamevarchar(255)
DECLARE@ExeSQLvarchar(4000)
DECLARETable_CursorCURSORFORSELECT[name]FROMsysobjectsWHERExtype=U
OPENTable_Cursor
FETCHNEXTFROMTable_CursorINTO@TableName
WHILE(@@FETCH_STATUS=0)
BEGIN
PRINT@TableName
SELECT@ExeSQL=DBCCCHECKTABLE(+@TableName+)
EXEC(@EXESQL)
FETCHNEXTFROMTable_CursorINTO@TableName
END
CLOSETable_Cursor
DEALLOCATETable_Cursor
GO
假如我们用sp_MSforeachtable就能够十分便利的到达不异的目标:
EXECsp_MSforeachtable@command1="print?DBCCCHECKTABLE(?)"
人人能够看出如许就加倍简便(固然在背景也是经由过程游标来处置的),上面我们就细心剖析一下sp_MSforeachtable这个存储历程:
我们看看sp_MSforeachtable具体的CODE:
USEMASTER
GO
SP_HELPTEXTsp_MSforeachtable
--上面时sp_MSforeachtable的原始代码
CREATEprocsp_MSforeachtable
@command1nvarchar(2000),@replacecharnchar(1)=N?,@command2nvarchar(2000)=null,
@command3nvarchar(2000)=null,@whereandnvarchar(2000)=null,
@precommandnvarchar(2000)=null,@postcommandnvarchar(2000)=null
as
/*Thisprocreturnsoneormorerowsforeachtable(optionally,matching@where),witheachtabledefaultingtoits
ownresultset*/
/*@precommandand@postcommandmaybeusedtoforceasingleresultsetviaatemptable.*/
/*Preprocessorwontreplacewithinquotessohavetousestr().*/
declare@mscatnvarchar(12)
select@mscat=ltrim(str(convert(int,0x0002)))
if(@precommandisnotnull)
exec(@precommand)
/*Createtheselect*/
exec(NdeclarehCForEachcursorglobalforselect[+REPLACE(user_name(uid),N],N]])+]+.+[
+REPLACE(object_name(id),N],N]])+]fromdbo.sysobjectso
+NwhereOBJECTPROPERTY(o.id,NIsUserTable)=1+Nando.category&+@mscat+N=0
+@whereand)
declare@retvalint
select@retval=@@error
if(@retval=0)
exec@retval=sp_MSforeach_worker@command1,@replacechar,@command2,@command3
if(@retval=0and@postcommandisnotnull)
exec(@postcommand)
return@retval
这个体系存储历程有7个参数:
@command1nvarchar(2000),--第一条运转的T-SQL指令
@replacecharnchar(1)=N?,--指定的占位标记
@command2nvarchar(2000)=null,--第二条运转的T-SQL指令
@command3nvarchar(2000)=null,--第三条运转的T-SQL指令
@whereandnvarchar(2000)=null,--可选前提来选择表
@precommandnvarchar(2000)=null,--在表前实行的指令
@postcommandnvarchar(2000)=null--在表后实行的指令
以是下面的语句也能够如许写:
EXECsp_MSforeachtable@command1="print?",
@command2="DBCCCHECKTABLE(?)"
懂得参数今后,就让我们做几个实列吧:
1.取得每一个表的纪录数和容量:
EXECsp_MSforeachtable@command1="print?",
@command2="sp_spaceused?",
@command3="SELECTcount(*)FROM?"
2.更新PUBS数据库中已t开首的一切表的统计:
EXECsp_MSforeachtable@whereand="andnameliket%",
@replacechar=*,
@precommand="printUpdatingStatistics.....print",
@command1="print*updatestatistics*",
@postcommand="printprintCompleteUpdateStatistics!"
sp_MSforeachDB除@whereand外,和sp_MSforeachtable的参数是一样的,我们能够经由过程这个存储历程检测一切的数据库,好比:
1.反省一切的数据库
EXECsp_MSforeachdb@command1="print?",
@command2="DBCCCHECKDB(?)"
有了下面的剖析,我们能够创建本人的sp_MSforeachObject:
USEMASTER
GO
CREATEprocsp_MSforeachObject
@objectTypeint=1,
@command1nvarchar(2000),
@replacecharnchar(1)=N?,
@command2nvarchar(2000)=null,
@command3nvarchar(2000)=null,
@whereandnvarchar(2000)=null,
@precommandnvarchar(2000)=null,
@postcommandnvarchar(2000)=null
as
/*Thisprocreturnsoneormorerowsforeachtable(optionally,matching@where),witheachtabledefaultingtoits
ownresultset*/
/*@precommandand@postcommandmaybeusedtoforceasingleresultsetviaatemptable.*/
/*Preprocessorwontreplacewithinquotessohavetousestr().*/
declare@mscatnvarchar(12)
select@mscat=ltrim(str(convert(int,0x0002)))
if(@precommandisnotnull)
exec(@precommand)
/*Defined@isobjectforsaveobjecttype*/
Declare@isobjectvarchar(256)
select@isobject=case@objectTypewhen1thenIsUserTable
when2thenIsView
when3thenIsTrigger
when4thenIsProcedure
when5thenIsDefault
when6thenIsForeignKey
when7thenIsScalarFunction
when8thenIsInlineFunction
when9thenIsPrimaryKey
when10thenIsExtendedProc
when11thenIsReplProc
when12thenIsRule
end
/*Createtheselect*/
/*Use@isobjectvariableissteadofIsUserTablestring*/
EXEC(NdeclarehCForEachcursorglobalforselect[+REPLACE(user_name(uid),N],N]])+]+.+[+
REPLACE(object_name(id),N],N]])+]fromdbo.sysobjectso
+NwhereOBJECTPROPERTY(o.id,N+@isobject+)=1+Nando.category&+@mscat+N=0
+@whereand)
declare@retvalint
select@retval=@@error
if(@retval=0)
exec@retval=sp_MSforeach_worker@command1,@replacechar,@command2,@command3
if(@retval=0and@postcommandisnotnull)
exec(@postcommand)
return@retval
GO
如许我们来测试一下:
1.取得一切的存储历程的剧本:
EXEcsp_MSforeachObject@command1="sp_helptext?",@objectType=4
2.取得一切的视图的剧本:
EXEcsp_MSforeachObject@command1="sp_helptext?",@objectType=2
3.好比在开辟过程当中,没一个用户都是本人的OBJECTOWNER,以是在实在的数据库时都要改成DBO:
EXEcsp_MSforeachObject@command1="sp_changeobjectowner?,dbo",@objectType=1
EXEcsp_MSforeachObject@command1="sp_changeobjectowner?,dbo",@objectType=2
EXEcsp_MSforeachObject@command1="sp_changeobjectowner?,dbo",@objectType=3
EXEcsp_MSforeachObject@command1="sp_changeobjectowner?,dbo",@objectType=4
如许就十分便利的将每个数据库工具改成DBO.
固然还要良多十分好的功效,人人能够本人深切研讨吧:-)
也许最好的策略是以不变应万变:给客户他们所需要的,不多也不少。如果MySQL学习教程适合他们,他们就不应该买别的工具。事实上,云计算产业一直推崇自助服务,但提供这些服务的公司已经开始认识到解决方案提供商推销他们商品的价值。 |
|