SQL 服务器查找存储过程
SQL Server look for stored procedure
我正在使用 SQL Server Management Studio,我有多个服务器连接,我需要知道每个包含多个数据库的服务器中特定存储过程的位置!
在每台服务器上寻找对 运行 的查询
这是一个小脚本,您可以在每台服务器上 运行。
我知道它使用 while
循环,这通常不是首选,有人可能会改进它。
运行 来自 master
数据库的脚本。
SQL 查询:
set nocount on
declare @procname varchar(150) = '<SPROCNAME_TO_FIND>' -- SET THIS TO THE STORED PROCEDURE NAME YOU ARE LOOKING FOR
declare @alldbonserver table
( databasename varchar(150),
doneflag bit )
declare @foundtbl table
( countcol int,
dbname varchar(150) )
declare @errortbl table
( dbname varchar(150) )
insert @alldbonserver
( databasename,
doneflag )
select sdb.name,
0
from sys.databases sdb
declare @curdbname varchar(150),
@sqlcmd varchar(max)
while exists (select 1
from @alldbonserver
where doneflag = 0)
begin
select top 1
@curdbname = databasename
from @alldbonserver
where doneflag = 0
select @sqlcmd = 'select distinct 1, ''' + @curdbname + ''' as dbname from ' + @curdbname + '.sys.objects where type = ''P'' and name = ''' + @procname + ''''
begin try
insert @foundtbl
( countcol, dbname )
exec(@sqlcmd)
end try
begin catch
insert @errortbl
values ( @curdbname )
end catch
update @alldbonserver
set doneflag = 1
where databasename = @curdbname
end
select dbname as 'Databases with stored procedure'
from @foundtbl
select dbname as 'Unable to access databases'
from @errortbl
set nocount off
示例输出:
Databases with stored procedure
-----------------------------------------
MainDatabase
SomeOtherDatabase
Unable to access databases
-----------------------------------------
model
ReportServer$SQLTemp
VeryPrivateDatabase
我只是把它放在 SQL2012 上。它应该 return 服务器上给定名称的所有存储过程。如果将@SPName 留空,您将获得所有这些。
查询利用 sys.all_objects,因此您可以轻松地将其更改为对表、函数、任何或所有数据库对象同样有效。
DECLARE @SPName VARCHAR(256)
SET @SPName = 'My_SP_Name'
DECLARE @DBName VARCHAR(256)
DECLARE @varSQL VARCHAR(512)
DECLARE @getDBName CURSOR
SET @getDBName = CURSOR FOR
SELECT name
FROM sys.databases
CREATE TABLE #TmpTable (DBName VARCHAR(256),
SchemaName VARCHAR(256),
SPName VARCHAR(256))
OPEN @getDBName
FETCH NEXT
FROM @getDBName INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @varSQL = 'USE [' + @DBName + '];
INSERT INTO #TmpTable
SELECT '''+ @DBName + ''' AS DBName,
SCHEMA_NAME(schema_id) AS SchemaName,
name AS SPName
FROM sys.all_objects
WHERE [type] = ''P'' AND name LIKE ''%' + @SPName + '%'''
EXEC (@varSQL)
FETCH NEXT
FROM @getDBName INTO @DBName
END
CLOSE @getDBName
DEALLOCATE @getDBName
SELECT *
FROM #TmpTable
DROP TABLE #TmpTable
如果您使用的是 SSMS,则可以创建一个服务器注册组,其中包含您连接到的所有服务器,右键单击该组,然后 运行 针对该组查询:exec sp_MSforeachdb 'select * from [?].sys.procedures where name=''<your_name_here>'''
此查询将枚举组中每个服务器上的每个数据库(注意:单引号是有原因的...)
我正在使用 SQL Server Management Studio,我有多个服务器连接,我需要知道每个包含多个数据库的服务器中特定存储过程的位置!
在每台服务器上寻找对 运行 的查询
这是一个小脚本,您可以在每台服务器上 运行。
我知道它使用 while
循环,这通常不是首选,有人可能会改进它。
运行 来自 master
数据库的脚本。
SQL 查询:
set nocount on
declare @procname varchar(150) = '<SPROCNAME_TO_FIND>' -- SET THIS TO THE STORED PROCEDURE NAME YOU ARE LOOKING FOR
declare @alldbonserver table
( databasename varchar(150),
doneflag bit )
declare @foundtbl table
( countcol int,
dbname varchar(150) )
declare @errortbl table
( dbname varchar(150) )
insert @alldbonserver
( databasename,
doneflag )
select sdb.name,
0
from sys.databases sdb
declare @curdbname varchar(150),
@sqlcmd varchar(max)
while exists (select 1
from @alldbonserver
where doneflag = 0)
begin
select top 1
@curdbname = databasename
from @alldbonserver
where doneflag = 0
select @sqlcmd = 'select distinct 1, ''' + @curdbname + ''' as dbname from ' + @curdbname + '.sys.objects where type = ''P'' and name = ''' + @procname + ''''
begin try
insert @foundtbl
( countcol, dbname )
exec(@sqlcmd)
end try
begin catch
insert @errortbl
values ( @curdbname )
end catch
update @alldbonserver
set doneflag = 1
where databasename = @curdbname
end
select dbname as 'Databases with stored procedure'
from @foundtbl
select dbname as 'Unable to access databases'
from @errortbl
set nocount off
示例输出:
Databases with stored procedure ----------------------------------------- MainDatabase SomeOtherDatabase Unable to access databases ----------------------------------------- model ReportServer$SQLTemp VeryPrivateDatabase
我只是把它放在 SQL2012 上。它应该 return 服务器上给定名称的所有存储过程。如果将@SPName 留空,您将获得所有这些。
查询利用 sys.all_objects,因此您可以轻松地将其更改为对表、函数、任何或所有数据库对象同样有效。
DECLARE @SPName VARCHAR(256)
SET @SPName = 'My_SP_Name'
DECLARE @DBName VARCHAR(256)
DECLARE @varSQL VARCHAR(512)
DECLARE @getDBName CURSOR
SET @getDBName = CURSOR FOR
SELECT name
FROM sys.databases
CREATE TABLE #TmpTable (DBName VARCHAR(256),
SchemaName VARCHAR(256),
SPName VARCHAR(256))
OPEN @getDBName
FETCH NEXT
FROM @getDBName INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @varSQL = 'USE [' + @DBName + '];
INSERT INTO #TmpTable
SELECT '''+ @DBName + ''' AS DBName,
SCHEMA_NAME(schema_id) AS SchemaName,
name AS SPName
FROM sys.all_objects
WHERE [type] = ''P'' AND name LIKE ''%' + @SPName + '%'''
EXEC (@varSQL)
FETCH NEXT
FROM @getDBName INTO @DBName
END
CLOSE @getDBName
DEALLOCATE @getDBName
SELECT *
FROM #TmpTable
DROP TABLE #TmpTable
如果您使用的是 SSMS,则可以创建一个服务器注册组,其中包含您连接到的所有服务器,右键单击该组,然后 运行 针对该组查询:exec sp_MSforeachdb 'select * from [?].sys.procedures where name=''<your_name_here>'''
此查询将枚举组中每个服务器上的每个数据库(注意:单引号是有原因的...)