2017-09-15 88 views
1

我創建了一個應用程序來同步具有相同結構的Microsoft SQL Server數據庫。我需要解決的任務之一是將任何數據庫例程(過程,函數,觸發器等)從源數據庫傳輸到目標數據庫。對於常規轉移我使用查詢我在哪裏可以在Microsoft SQL Server中找到CLR函數文本?

SELECT [definition] FROM sys.sql_modules WITH (NOLOCK) WHERE object_id = OBJECT_ID('SOME_OBJECT_ID') 

SELECT * FROM INFORMATION_SCHEMA.ROUTINES where routine_name like '%SOME_ROUTINE_NAME%' 

而且它完全適用於除CLR函數的所有程序(與[type_desc] = CLR_TABLE_VALUED_FUNCTION[type_desc] = CLR_SCALAR_FUNCTION的功能)。

他們的文本不存儲在數據表sys.sql_modules和系統視圖INFORMATION_SCHEMA.ROUTINES包含的值[ROUTINE_BODY] = EXTERNAL[ROUTINE_DEFINITION] = NULL

但我相信每次打開CLR函數文本都不會重新創建,因爲它可以隨用戶更改而更改和保存。

所以我會非常感謝任何有關CLR功能文本位置的提示。

更新:我不需要傳遞.NET庫函數本身,我只是想傳遞在可編程性>函數>表值函數中手動創建的包裝函數。

+0

CLR函數是在.NET中創建並在SQL服務器中註冊的程序集(dll)。你可以從程序集sys.assemblies獲取列表。所以你不會在SQL Server中獲得CLR函數的文本定義。 –

+0

@RahulRichhariya,我不想傳輸CLR函數(= .NET庫函數),我問了一個關於CLR_TABLE_VALUED_FUNCTION或CLR_SCALAR_FUNCTION的問題 - 可在Programmability> Functions> Table-valued Functions函數列表中找到的對象。您可以像編輯任何標準函數(SQL_SCALAR_FUNCTION)一樣編輯和保存此對象。 – Dmitry

+0

因此,您試圖生成「CREATE FUNCTION [dbo]」。[len_s](@str nvarchar(4000)) RETURNS bigint AS EXTERNAL NAME [SurrogateStringFunction]。[Microsoft.Samples.SqlServer 。.SurrogateStringFunction] [透鏡];'? –

回答

0

Server Profiler顯示了35個不同的動態查詢,由Management Studio用來構建CLR包裝函數。因此,不幸的是,功能文本在運行中並且沒有任何內容存儲在系統數據庫的深處。

0

如果您想查看CLR函數或過程,您需要執行一些步驟作爲CLR函數,則會從程序集創建過程。

第1步: - 導出你的組件文件系統

步驟2: - 使用.NET程序集反編譯像http://ilspy.net/或者紅門反射器

如果組件創建者沒有執行此方法編輯添加步驟以防止反編譯。

+0

我不需要在數據庫之間傳輸.NET庫,我想要傳遞在Programmability> Functions> Table-valued Functions中創建的CLR包裝函數。請看@ Damien_The_Unbeliever的評論,他明白了。 – Dmitry

+0

確定了你。你使用PowerShell或你想只使用SQL查詢嗎? –

+0

我更喜歡使用SQL查詢,但我會非常感謝您提供的任何解決方案。但對我來說,聽起來很奇怪,所有查詢都位於'sys.sql_modules'數據表中,並且可以很容易地選擇,並且需要使用PowerShell來提取CLR包裝查詢(它們看起來方式相同,可以用相同方式更改) 。 – Dmitry

相關問題