2016-09-06 128 views
0

我正在使用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

,你可以使用'sys.all_objects'視圖,數據庫的前綴:'SELECT * FROM DatabaseName。[sys]。[all_objects] WHERE type_desc LIKE'%function%'' – Lamak

回答

0

您可以使用使用動態SQL

use dbname 

SELECT routines.routine_name, * 
FROM information_schema.routines where ROUTINE_TYPE = 'FUNCTION' 
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 

它會列出每個在它的函數庫(和返回零個集爲那些不這樣做),但你可以修改查詢過濾你喜歡的任何東西。

0

--run這個腳本

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

+0

爲什麼在'information_schema.routines'中搜索'specific_name',但是在結果集中選擇'routine_name'? 'specific_name'和'routine_name'可以不同嗎? – srh