如何在使用其他数据库时搜索数据库中的函数?

时间:2016-09-06 17:22:51

标签: sql sql-server database

我正在使用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变量中的数据库中查找函数名称。

我该怎么做?

3 个答案:

答案 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