我正在使用SQL Server 2008 R2。
假设我有一些用户数据库。我想写一个脚本告诉我哪些用户数据库有一个名为 dbo.udf_GetEmployeeRate()的函数。
该脚本可以针对任何数据库运行。
到目前为止,我编写了脚本来遍历所有用户数据库并在循环中的变量中获取数据库名称:
declare @v_database_name varchar(256)
declare @v_function_name_to_search varchar(25)
select @v_function_name_to_search = 'udf_GetEmployeeRate'
declare c_db cursor read_only local for
select name
from sys.databases
where name not in ('master', 'tempdb', 'model', 'msdb', 'ReportServer', 'ReportServerTempDB') and is_distributor = 0
order by name
open c_db
while 1 = 1
begin
fetch from c_db into @v_database_name
if @@FETCH_STATUS <> 0
break
select @v_database_name '@v_database_name'
end
close c_db
deallocate c_db
现在问题是如何在名称在@v_database_name
变量中的数据库中查找函数名称。
我该怎么做?
答案 0 :(得分:1)
DECLARE @command varchar(1000)
SELECT @command = 'USE ? select * from information_schema.routines where specific_name = ''udf_GetEmployeeRate'' AND routine_type= ''FUNCTION'''
EXEC sp_MSforeachdb @command
它将列出每个具有该功能的数据库(并为那些不会返回零行集),但您可以修改查询以过滤您喜欢的任何内容。
答案 1 :(得分:0)
您可以使用动态sql
use dbname
SELECT routines.routine_name, *
FROM information_schema.routines where ROUTINE_TYPE = 'FUNCTION'
答案 2 :(得分:0)
- 运行此脚本
IF OBJECT_ID('tempdb..#FunctionFinder') IS NOT NULL
DROP TABLE #FunctionFinder
CREATE TABLE #FunctionFinder(ROUTINE_CATALOG NVARCHAR(255), ROUTINE_NAME NVARCHAR(255))
DECLARE @command NVARCHAR(500), @fn_Name NVARCHAR(255) = 'udf_GetEmployeeRate'
SELECT @command = 'USE ? select ROUTINE_CATALOG, ROUTINE_NAME from information_schema.routines where specific_name = ''' + @fn_Name + ''' AND routine_type= ''FUNCTION'''
INSERT INTO #FunctionFinder
EXEC sp_MSforeachdb @command
SELECT * FROM #FunctionFinder
EXEC sp_MSforeachdb @command SELECT * FROM #FunctionFinder