在使用SQL Server 2005的性能报表进行调优的过程中,有些语句不知在哪个数据库中执行,可参看这篇文章[原]一次SQL Server调优经历 ,于是针对这个问题,我写了两段脚本用于按照对象名找出其所在的数据库。
在编写的过程中发现SQL Server 2005比SQL Server 2000在操作集合方面完善很多。第一段SQL Server 2005专用脚本使用了集合的交操作,非常简单地完成任务了,而第二段通用的就要借助临时表。
运行方式很简单,把“用户修改区域”里面改成你需要查找的对象名,然后把SQL脚本copy到查询分析器中运行就OK了。
例如:将用户修改区域改成:
set
@target
=
N
'
select '' aspnet_Paths '' union all
select '' aspnet_Profile ''
' ;
select '' aspnet_Paths '' union all
select '' aspnet_Profile ''
' ;
执行脚本之后将会打印以下语句。
Object(s) Found
In
Database
: MSPetShop4Services
SQL Server 2005:
--
------------------说明-------------------
-- 在同一个实例的SQL Server 2005数据库
-- 中按照对象名找出其所在的数据库
-- @taget为对象的名字集合,关系为'与'
-- Powered by killkill
-- ------------------说明-------------------
use master;
declare @target varchar ( max );
-- --------------用户修改区域---------------
-- 示例 Example
-- set @target=N'
-- select ''<tableName/viewName/spName/etc..>'' union all
-- select ''<tableName/viewName/spName/etc..>''
-- ';
declare @cmd varchar ( max );
declare cur_cmd cursor
for
select
' use ' + name + ' ; ' +
' if not exists ( ' +
@target +
' except ' +
' select name from ' +
' sys.objects ' +
' intersect ( ' +
@target +
' ) ' +
' ) ' +
' print '' Object(s) Found In Database: ' +
name +
''' '
from sys.databases
where name not in ( ' master ' , ' tempdb ' , ' model ' , ' msdb ' );
open cur_cmd;
fetch next from cur_cmd into @cmd ;
While @@fetch_status = 0
begin
exec ( @cmd );
-- print @cmd; --only for debug
fetch next from cur_cmd into @cmd ;
end
print N ' Powered by killkill ' ;
close cur_cmd;
deallocate cur_cmd;
-- 在同一个实例的SQL Server 2005数据库
-- 中按照对象名找出其所在的数据库
-- @taget为对象的名字集合,关系为'与'
-- Powered by killkill
-- ------------------说明-------------------
use master;
declare @target varchar ( max );
-- --------------用户修改区域---------------
-- 示例 Example
-- set @target=N'
-- select ''<tableName/viewName/spName/etc..>'' union all
-- select ''<tableName/viewName/spName/etc..>''
-- ';
set
@target
=
N
'
select '' aspnet_Paths '' union all
select '' aspnet_Profile ''
' ;
--
--------------用户修改区域---------------
select '' aspnet_Paths '' union all
select '' aspnet_Profile ''
' ;
declare @cmd varchar ( max );
declare cur_cmd cursor
for
select
' use ' + name + ' ; ' +
' if not exists ( ' +
@target +
' except ' +
' select name from ' +
' sys.objects ' +
' intersect ( ' +
@target +
' ) ' +
' ) ' +
' print '' Object(s) Found In Database: ' +
name +
''' '
from sys.databases
where name not in ( ' master ' , ' tempdb ' , ' model ' , ' msdb ' );
open cur_cmd;
fetch next from cur_cmd into @cmd ;
While @@fetch_status = 0
begin
exec ( @cmd );
-- print @cmd; --only for debug
fetch next from cur_cmd into @cmd ;
end
print N ' Powered by killkill ' ;
close cur_cmd;
deallocate cur_cmd;
SQL 2000/2005 通用:
--
------------------说明-------------------
-- 在同一个实例的SQL Server 2000/2005数据库
-- 中按照对象名找出其所在的数据库
-- @taget为对象的名字集合,关系为'与'
-- Powered by killkill
-- ------------------说明-------------------
use master;
declare @target varchar ( 8000 );
-- --------------用户修改区域---------------
-- 示例 Example
-- set @target=N'
-- select ''<tableName/viewName/spName/etc..>'' union all
-- select ''<tableName/viewName/spName/etc..>''
-- ';
set @target = N '
select '' CZCOK2 '' union all
select '' CZGSKG ''
' ;
-- --------------用户修改区域---------------
declare @cmd varchar ( 8000 );
declare cur_cmd cursor
for
select
' use ' + name + ' ; ' +
N '
set nocount on;
declare @targetCount int;
declare @foundCount int;
if object_id( '' tempdb..#tmpObjectNames '' ) is not null
drop table #tmpObjectNames
create table #tmpObjectNames
(
name varchar(500)
)
insert into #tmpObjectNames ' +
@target +
' select @foundCount=count(*) from sysobjects inner join #tmpObjectNames
on sysobjects.name = #tmpObjectNames.name collate Chinese_PRC_CI_AI_WS
select @targetCount=count(*) from #tmpObjectNames
if ( @foundCount = @targetCount )
print '' Object(s) Found In Database: ' + name + '''
set nocount off;
drop table #tmpObjectNames;
'
from sysdatabases
where name not in ( ' master ' , ' tempdb ' , ' model ' , ' msdb ' );
open cur_cmd;
fetch next from cur_cmd into @cmd ;
While @@fetch_status = 0
begin
exec ( @cmd );
-- print @cmd; --only for debug
fetch next from cur_cmd into @cmd ;
end
print N ' Powered by killkill ' ;
close cur_cmd;
deallocate cur_cmd;
-- 在同一个实例的SQL Server 2000/2005数据库
-- 中按照对象名找出其所在的数据库
-- @taget为对象的名字集合,关系为'与'
-- Powered by killkill
-- ------------------说明-------------------
use master;
declare @target varchar ( 8000 );
-- --------------用户修改区域---------------
-- 示例 Example
-- set @target=N'
-- select ''<tableName/viewName/spName/etc..>'' union all
-- select ''<tableName/viewName/spName/etc..>''
-- ';
set @target = N '
select '' CZCOK2 '' union all
select '' CZGSKG ''
' ;
-- --------------用户修改区域---------------
declare @cmd varchar ( 8000 );
declare cur_cmd cursor
for
select
' use ' + name + ' ; ' +
N '
set nocount on;
declare @targetCount int;
declare @foundCount int;
if object_id( '' tempdb..#tmpObjectNames '' ) is not null
drop table #tmpObjectNames
create table #tmpObjectNames
(
name varchar(500)
)
insert into #tmpObjectNames ' +
@target +
' select @foundCount=count(*) from sysobjects inner join #tmpObjectNames
on sysobjects.name = #tmpObjectNames.name collate Chinese_PRC_CI_AI_WS
select @targetCount=count(*) from #tmpObjectNames
if ( @foundCount = @targetCount )
print '' Object(s) Found In Database: ' + name + '''
set nocount off;
drop table #tmpObjectNames;
'
from sysdatabases
where name not in ( ' master ' , ' tempdb ' , ' model ' , ' msdb ' );
open cur_cmd;
fetch next from cur_cmd into @cmd ;
While @@fetch_status = 0
begin
exec ( @cmd );
-- print @cmd; --only for debug
fetch next from cur_cmd into @cmd ;
end
print N ' Powered by killkill ' ;
close cur_cmd;
deallocate cur_cmd;
在一两个数据库中找出某些表的所属数据库还是可以接受的,但是在三十多个数据库里找出某些表所属的数据库,还是得借助上面的脚本啦。