MYSQL编程:浅析SQL SERVER一个没有公然的存储历程...
越来越多的开发者将继续选择MySQL。Evans的总裁JohnAndrews表示,MySQL学习教程用户对MySQL和其他开源数据库的评价正在赶上甚至超过很多专有商业数据库软件。server|存储历程浅析SQLSERVER一个没有公然的存储历程
从SQLSERVER6.5入手下手,MS供应了一个十分有效的体系存储历程sp_MSforeachtable和sp_MSforeachDB;作为DBA会常常必要反省一切的数据库或用户表,好比:反省一切数据库的容量;看看指定命据库一切用户表的容量,一切表的纪录数...,我们一样平常处置如许的成绩都是用游标分离处置处置,好比:在数据库检索效力十分慢时,我们想反省数据库一切的用户表,我们就必需如许写游标:
DECLARE@TableNamevarchar(255)
DECLARE@ExeSQLvarchar(4000)
DECLARETable_CursorCURSORFORSELECTFROMsysobjectsWHERExtype=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学习教程适合他们,他们就不应该买别的工具。事实上,云计算产业一直推崇自助服务,但提供这些服务的公司已经开始认识到解决方案提供商推销他们商品的价值。 入门没那么困难,精通没那么容易 XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!) 换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的 一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。) 总感觉自己还是不会SQL 发几份SQL课件,以飨阅者 在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。 比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。
页:
[1]